4. Немного истории
• Уязвимости ГПСЧ находили в:
• Windows XP
• Windows server 2003
• Ранние версии SSL(v1)
• PHP (дада, PHPSESSID) функции mt_rand(),
rand(), uniqid(), shuffle(), lcg_value()
6. Генераторы случайных и псевдослучайных чисел
• Генераторы случайных чисел аппаратные
• Идеальный источник энтропии- белый шум
• Генераторы псевдослучайных чисел
алгоритмические
• Проблема генераторов псевдослучайных
чисел- последовательность и
зацикленность.
• ГСЧ= ГПСЧ+ источник энтропии
7. Предпосылки для «взлома» ГПСЧ
• Значения генерируются исходя из текущего
внутреннего состояния ГПСЧ
• Для генерации случайных значений
используются однонаправленные свертки.
• При одном и том же исходном значении Seed
и равном количестве переходов, значения
случайных величин будут одинаковы.
• Вывод. Если станет известно текущее
состояние ГСПЧ все последующие состояния и
генерируемые значения можно предсказать.
8. int
Иллюстрация работы алгоритмического ГСПЧ
double
byte
boolean
В качестве источника энтропии часто используется системное время
Чем больше энтропия генерируемой величины, тем проще
определить состояние ГПСЧ
9. Java.Util.Random
-Seed получается из системного времени:
System.currentTimeMillis()
-Значение Seed (long, 64 bit) хранит текущее состояния ГПСЧ
-При каждом получении случайного значения выполняется следующее:
int next(int bits)
{
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int) (seed >>> (48 - bits));
}
-Преобразователь seed- детерминированный конечный автомат.
-Получение случайного int:
bits = next(31);
val = bits % n;
-Сдвиг на 17 позиций вправо.
10. Получаем Seed
-Берем два созданных int value1 и value2
-Сдвигаем биты value1 обратно влево, перебираем все
варианты оставшихся 17 неизвестных бит:
seed = (value1 << 17) + i;
-Когда условие value2 == nextInt(seed) выполнится мы нашли
seed!
-Возможных комбинаций 131072 (2^17)
-Проблема: свертка получением остатка. (val = bits % n;)
-Ничего не поделаешь, придется перебирать все варианты =((
11. Все любят котов
int nextInt()
{
int bits, val;
do
{
bits = next();
val = bits % rand;
}
while (bits - val + (rand - 1) < 0);
return val;
}
void unrand()
{
boolean circle = true;
for(long j = start; j < end && !found;
j++)
{
long srclocal = src1 + rand*j;
circle = true;
12. Итак, мы знаем seed
• Теперь мы можем предсказать все
последующие и производные значения
• Сессионные ключи, идентификаторы, все
случайные значения созданные ГПСЧ итд
все наше =))
13. apache.commons.RandomStringUtils
• -Объект java.util.Random статичен
• -Все объекты RandomStringUtils используют один
и тот же объект java.util.Random, который сидится
один раз.
• -Принцип работы: задается выбор случайной
позиции из заданного charset.
• -Необходимо 7 символов для подбора при
использовании alphanumeric charset.
• -Время на подбор для Intel core i7 2.5GHZ ~30мин
14. Как это работает
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
H
A
C
K
E
R
Int = 17
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 10
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 12
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 20
HACKER
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 14
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 27
15. Что делать?
Или криптографически стойкие ГПСЧ
• java.security.SecureRandom
• Наследуется от java.util.Random,
оверрайдит методы
• Не обеспечивает полной
непредсказуемости, так как использует
хеширование для свертки. (по умолчанию-
sha-1)
• Множество состояний ГПСЧ все равно long,
переходы- все еще однозначны
16. Что делать (часть 2, суровая)
• Аппаратная энтропия (дробовой шум итд)
• /dev/random (суровый, но медленный)
• /dev/urandom on Linux (менее суровый, но
побыстрее)
• Проблемы с производительностью
(накопление энтропии)
17. Цена вопроса
Manufacturer Model
Intro
Date
Interface OS
Price
(USD)
Price Throughput
Simtec
Electronics
Entropy Key 2009 USB
Windows[1]
/Linux/BSD
60< £36 32 kbit/s[2]
ID Quantique
SA
Quantis-USB 2006 USB
Windows/L
inux
1,310 990€ 4 Mbit/s[3]
ID Quantique
SA
Quantis-PCI-4 2006 PCI
Windows/L
inux
2,952 2,230€ 16 Mbit/s[3]
Comscire R2000KU 2006 USB
Linux/Wind
ows
895 738€ 2 Mbit/s[4]
Comscire R32MU 2012 USB
Linux/Wind
ows
1,495 1,232€ 32 Mbit/s[5]
LETech GRANG
2008-
2012
PCI/USB3/
SATA
Linux/Wind
ows
6,800 5,500€ 400 Mbit/s[6]
TRNG98 TRNG9803 2009 SERIAL
Linux/Wind
ows/Solaris
/BSD
230 179€ 72 kbit/s[7]
TRNG98 TRNG9815 2009 USB
Linux/Wind
ows/Solaris
/BSD
830 620€ 550 kbit/s[8]
18. Заключение
• Любые алгоритмические генераторы
случайных чисел- псевдослучайны.
• При необходимости создания
«непредсказуемой» случайной величины
необходимо использовать физический
источник энтропии
• Человек- хороший физический источник
энтропии.