Соленые пароли
- Криптографическая соль [salt] – случайный код, который используется для обеспечения непредсказуемости при хешировании паролей
- Либо h=HASH(p||s)
- Либо в стандарте хеш-функции указан дополнительный параметр h=HASH(p,s)
- В качестве соли может использоваться вектор инициализации
- В файле проверки паролей хранятся значения соли и хеш-функции пароля для каждого пользователя
- Преимущества:
- Соль защищает от перебора паролей при помощи радужных таблиц
- Если у пользователя есть два аккаунта с одним и тем же паролем, хеш-функция от этих паролей будет разная
- Безопасная длина соли ~128 бит
пользователь
|
соль
|
хэш-функция
|
…
|
…
|
…
|
Содержание лекции
- Атаки на хешированные пароли и защита от них
- Специализированные функции для хеширования паролей
- Общие сведения
- PBKDF2
- Scrypt
Общие сведения
KDF
- Функции формирования ключа [Key Derivation Function, KDF] – специализированные хеш-функции для получения ключей симметричного шифрования на основе произвольных данных
- Также применяются для:
- хеширования паролей
- контроля целостности записей в распределенных реестрах
- Если обычные ХФ должны по возможности вычисляться быстро, то вычисление KDF должно быть ресурсоемким и трудно распараллеливаемым
- Обычные ХФ часто вычисляются от больших файлов, KDF как правило от небольших объемов данных
PBKDF2
Password-based KDF, RSA Laboratories, 2000
Параметры:
K = PBKDF2 ( PRF, P, S, c, kLen)
- PRF [pseudorandom function] «псевдослучайная функция» – используемый в рамках PBKDF2 алгоритм вычисления имитовставки (как правило, HMAC)
- P - Пароль
- S – соль
- с – количество раундов (рекомендуется от 1000)
- kLen – длина ключа в байтах
PBKDF2
- Длина ключа может быть различной
- Ключ разбивается на блоки с такой же длиной, как у имитовставки
- Каждый i-й блок K[i] вычисляется по следующему алгоритму:
U[0] = S||i; //суммарная длина S и i должна быть равна длине имитовставки
K[i] = 0;
для j от 1 до c
U[j] = PRF( P, U[j-1] ); // P трактуется как ОТ, а U - как ключ имитовставки
K[i] = xor( K[i], U[j] );
конец
PBKDF2
- WPA-PSK:
- PBKDF2( HMAC-SHA2, P, ssid, 4096, 256 )
где ssid – идентификатор точки доступа
- Р 50.1.111 2016
- PBKDF2( HMAC-Стрибог-512, P, S, >1000, 256 )
- Злоумышленник не может распараллелить вычисление PBKDF2, если длина выходного ключа меньше, чем длина блока
- Однако можно параллельно вычислять хеши для разных вариантов пароля
scrypt
- Колин Персиваль, 2009
- Для быстрого вычисления требуется большой объем оперативной памяти, поэтому распараллеливание на ПЛИС или GPU не дает значительного преимущества
- В рамках стандарта используются:
- PBKDF2 на основе HMAC от SHA256
- алгоритм Salsa20/8 (Salsa20 c количеством раундов 8 вместо 20)
- Параметры:
K = scrypt (P, S, c, r, p, kLen)
- P – пароль
- S – соль
- с – количество раундов
- r – размер блока в кибибитах (1 Киб = 128 Б = 1024 б)
- p – степень параллельности
- kLen – длина ключа
scrypt
Алгоритм:
B = PBKDF2 (P,S,1,p*r*128) \\ B - массив из p блоков по 128*r байт
для i от 0 до p-1 выполнить B[i]=MIX(B[i],c)
K = PBKDF2(P,B,1,kLen)
Функция X = MIX( B, c ):
X = B
для i от 0 до (2^c)-1 выполнить
V[i] = X
X = BlockMIX(X)
конец
шаг 3. для i от 0 до (2^c)-1 выполнить
j = X mod 2^c
X = BlockMIX(X)
конец
scrypt
Функция A = BlockMIX( B ):
// B - массив 64-битных блоков
r = length(B)/128
X = B[2*r-1]
для i от 0 до (2^c)-1 выполнить
X = Salsa20_8(X xor B[i])
Y[i] = X
конец
A = Y[0] || Y[2] || … || Y[2*r-2] || Y[1] || Y[3] || … || Y[2*r-1]
Выбор параметров алгоритма:
- Требуемый объем оперативной памяти для быстрого вычисления 128*r*c байт
- Рекомендуемая версия параметров с=16384 r=8 p=1
- «Криптовалютная» (слабая) версия параметров с=1024 r=1 p=1
Темы докладов
Достарыңызбен бөлісу: |