У этой статьи нечеткий стиль цитирования . Декабрь 2012 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
В криптографии , PBKDF1 и PBKDF2 ( Password-Based Key Вывод Функция 1 и 2 ) являются ключевыми функции деривации с выдвижными вычислительными затратами, которые используются для снижения уязвимости грубой силы нападения .
PBKDF2 является частью RSA Laboratories ' Public Key Cryptography Standards- серии (PKCS), в частности , PKCS # 5 v2.0, а также опубликованы в качестве целевой группы Internet Engineering ' RFC s 2898. Он заменяет PBKDF1, которые могут производить только полученные ключи до 160 биты длинные. [1] RFC 8018 (PKCS # 5 v2.1), опубликованный в 2017 г., рекомендует PBKDF2 для хеширования паролей. [2]
Назначение и работа [ править ]
PBKDF2 применяет псевдослучайную функцию , такую как код аутентификации сообщения на основе хэша (HMAC), к входному паролю или парольной фразе вместе со значением соли и повторяет процесс много раз для создания производного ключа , который затем может использоваться в качестве криптографического ключа. в последующих операциях. Дополнительная вычислительная работа значительно затрудняет взлом пароля и известна как растяжение ключа .
Когда стандарт был написан в 2000 году, рекомендуемое минимальное количество итераций составляло 1000, но этот параметр предполагается увеличивать с течением времени по мере увеличения скорости процессора. Стандарт Kerberos в 2005 году рекомендовал 4096 итераций; [3] Apple, как сообщается, использовала 2000 для iOS 3, и10 000 для прошивки 4; [4] в то время как LastPass в 2011 году использовал 5000 итераций для клиентов JavaScript и100 000 итераций для хеширования на стороне сервера. [5]
Добавление соли к паролю снижает возможность использования предварительно вычисленных хэшей ( радужных таблиц ) для атак и означает, что несколько паролей необходимо проверять индивидуально, а не все сразу. Стандарт рекомендует длину соли не менее 64 бит. [6] Национальный институт стандартов и технологий США рекомендует 128 бит. [7]
Процесс получения ключа [ править ]
Функция создания ключа PBKDF2 имеет пять входных параметров: [8]
DK = PBKDF2 (PRF, пароль, соль, c, dkLen)
где:
- PRF - это псевдослучайная функция двух параметров с выходной длиной hLen (например, HMAC с ключом)
- Пароль - это мастер-пароль, на основе которого создается производный ключ.
- Соль - это последовательность битов, известная как криптографическая соль.
- c - желаемое количество итераций
- dkLen - желаемая длина в битах производного ключа
- DK - это сгенерированный производный ключ
Каждый hLen -битовый блок T i производного ключа DK вычисляется следующим образом (с +
конкатенацией строк маркировки):
DK = T 1 + T 2 + ⋯ + T dklen / hlen T i = F (Пароль, Salt, c, i)
Функция F является xor (^) c итераций связанных PRF. Первая итерация PRF использует пароль в качестве ключа PRF и Salt, объединенный с i, закодированным как 32-битное целое число с прямым порядком байтов, в качестве входных данных. (Обратите внимание, что i - это индекс, отсчитываемый от 1.) Последующие итерации PRF используют пароль в качестве ключа PRF, а выходные данные предыдущего вычисления PRF в качестве входных:
F (Пароль, Соль, c, i) = U 1 ^ U 2 ^ ⋯ ^ U c
где:
U 1 = PRF (Пароль, соль + INT_32_BE (i))U 2 = PRF (Пароль, U 1 )⋮U c = PRF (Пароль, U c − 1 )
Например, WPA2 использует:
DK = PBKDF2 (HMAC-SHA1, кодовая фраза, ssid, 4096, 256)
У PBKDF1 был более простой процесс: начальный U (называемый T в этой версии) создается с помощью PRF(Password + Salt)
, а следующие просто . Ключ извлекается как первые биты dkLen окончательного хэша, поэтому существует ограничение на размер. [8]PRF(Uprevious)
Коллизии HMAC [ править ]
PBKDF2 имеет интересное свойство при использовании HMAC в качестве псевдослучайной функции. Можно легко создать любое количество различных пар паролей с конфликтами внутри каждой пары. [9] Если предоставленный пароль длиннее, чем размер блока базовой хэш-функции HMAC, пароль сначала предварительно хешируется в дайджест, и этот дайджест вместо этого используется в качестве пароля. Например, следующий пароль слишком длинный:
- Пароль:
plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
поэтому (например, при использовании HMAC-SHA1) он предварительно хешируется с использованием SHA-1 в:
- SHA1 (шестнадцатеричный):
65426b585154667542717027635463617226672a
Что может быть представлено в ASCII как:
- SHA1 (ASCII):
eBkXQTfuBqp'cTcar&g*
Это означает, что независимо от соли или итераций PBKDF2-HMAC-SHA1 будет генерировать одни и те же ключевые байты для паролей:
- "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"
- "eBkXQTfuBqp'cTcar & g *"
Например, используя:
- PRF : HMAC-SHA1
- Соль: A009C1A485912C6AE630D3E744240B04
- Итераций: 1000
- Длина полученного ключа: 16 байт
следующие два вызова функций:
PBKDF2-HMAC-SHA1 ("plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd", ...)PBKDF2-HMAC-SHA1 ("eBkXQTfuBqp'cTcar & g *", ...)
будет генерировать те же производные ключевые байты ( 17EB4014C8C461C300E9B61518B9A18B
). Эти производные конфликты ключей не представляют собой уязвимости в системе безопасности, поскольку для генерации хэша пароля необходимо знать исходный пароль. [10]
Альтернативы PBKDF2 [ править ]
Одной из слабых сторон PBKDF2 является то, что, хотя его количество итераций можно настроить так, чтобы оно занимало сколь угодно большое количество вычислительного времени, его можно реализовать с помощью небольшой схемы и очень небольшого объема оперативной памяти, что позволяет проводить атаки методом грубой силы с использованием встроенных приложений для конкретных приложений. схемы или графические процессоры относительно дешевы. [11] Функция хеширования паролей bcrypt требует большего объема ОЗУ (но все еще не настраивается отдельно, т. Е. Фиксируется для заданного количества процессорного времени) и немного сильнее противостоит таким атакам, [12] в то время как более современная функция получения ключей scrypt может использовать произвольно большие объемы памяти и, следовательно, более устойчив к атакам ASIC и GPU.[11]
В 2013 году был проведен конкурс по хешированию паролей (PHC) для разработки более стойкого подхода. 20 июля 2015 года Argon2 был выбран в качестве окончательного победителя PHC с особым признанием четырех других схем хеширования паролей: Catena, Lyra2 , yescrypt и Makwa. [13] Другой альтернативой является хеширование Balloon , которое рекомендуется в рекомендациях NIST по паролям . [14]
См. Также [ править ]
- Список реализаций PBKDF2
Ссылки [ править ]
- ^ <[email protected]>, Burt Kaliski. "PKCS #5: Password-Based Cryptography Specification Version 2.0". tools.ietf.org. Retrieved 2015-10-23.
- ^ "PKCS #5: Password-Based Cryptography Specification Version 2.1". tools.ietf.org.
- ^ Kenneth Raeburn. "Advanced Encryption Standard (AES) Encryption for Kerberos 5". tools.ietf.org. Retrieved 2015-10-23.
- ^ "Smartphone Forensics: Cracking BlackBerry Backup Passwords". Advanced Password Cracking – Insight (ElcomSoft). Retrieved 2015-10-23.
- ^ "LastPass Security Notification". The LastPass Blog. Retrieved 2015-10-23.
- ^ K. Moriarty; et al. "RFC 8018 - PKCS #5: Password-Based Cryptography Specification, Version 2.1". tools.ietf.org. Retrieved 2018-01-24.
- ^ Meltem Sönmez Turan, Elaine Barker, William Burr, and Lily Chen. "NIST SP 800-132, Recommendation for Password-Based Key Derivation Part 1: Storage Applications" (PDF). www.nist.gov. Retrieved 2018-12-20.CS1 maint: multiple names: authors list (link)
- ^ a b RFC 2898
- ^ https://mathiasbynens.be/notes/pbkdf2-hmac
- ^ https://crypto.stackexchange.com/questions/26510/why-is-hmac-sha1-still-considered-secure
- ^ a b Colin Percival. scrypt. As presented in "Stronger Key Derivation via Sequential Memory-Hard Functions". presented at BSDCan'09, May 2009.
- ^ "New 25 GPU Monster Devours Passwords In Seconds". The Security Ledger. 2012-12-04. Retrieved 2013-09-07.
- ^ "Password Hashing Competition"
- ^ NIST SP800-63B Section 5.1.1.2
External links[edit]
- RSA PKCS #5 – RSA Laboratories PKCS #5 v2.1.
- RFC 2898 – Specification of PKCS #5 v2.0.
- RFC 6070 – Test vectors for PBKDF2 with HMAC-SHA1.
- NIST Special Publication 800-132 Recommendation for Password-Based Key Derivation