Русская Википедия:Bcrypt
Шаблон:Lowercase Шаблон:Карточка хеш-функции bcrypt — адаптивная криптографическая хеш-функция формирования ключа, используемая для защищенного хранения паролей. Разработчики: Нильс Провос и David Mazières. Функция основана на шифре Blowfish, впервые представлена на USENIX в 1999 году[1]. Для защиты от атак с помощью радужных таблиц bcrypt использует соль (salt); кроме того, функция является адаптивной, время её работы легко настраивается и её можно замедлить, чтобы усложнить атаку перебором.
Шифр Blowfish отличается от многих алгоритмов вычислительно сложной фазой en (Key stretching).
Провос и Mazières воспользовались этой особенностью, но изменили алгоритм подготовки ключей, получив шифр «Eksblowfish» (Шаблон:Lang-en2). Количество раундов в подготовке ключей должно быть степенью двойки; конкретная степень может задаваться при использовании bcrypt.
Изначально реализовано в функции crypt в OpenBSD. Существуют реализации для Java, Python, Nim, C#, Ruby, Perl, PHP 5.3, Node.js, Go[2] и некоторых других.
Алгоритм
Алгоритм bcrypt использует алгоритм настройки ключей из «Eksblowfish»:
EksBlowfishSetup(cost, salt, key) state <math>\gets</math> InitState() state <math>\gets</math> ExpandKey(state, salt, key) repeat (2cost) state <math>\gets</math> ExpandKey(state, 0, key) state <math>\gets</math> ExpandKey(state, 0, salt) return state
Функция InitState соответствует оригинальной функции из шифра Blowfish; для заполнения массива P и S-box используется дробная часть числа <math>\pi</math>.
Функция ExpandKey:
ExpandKey(state, salt, key) for(n = 1..18) Pn <math>\gets</math> key[32(n-1)..32n-1] <math>\oplus</math> Pn //treat the key as cyclic ctext <math>\gets</math> Encrypt(salt[0..63]) P1 <math>\gets</math> ctext[0..31] P2 <math>\gets</math> ctext[32..63] for(n = 2..9) ctext <math>\gets</math> Encrypt(ctext <math>\oplus</math> salt[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic P2n-1) <math>\gets</math> ctext[0..31] P2n <math>\gets</math> ctext[32..63] for(i = 1..4) for(n = 0..127) ctext <math>\gets</math> Encrypt(ctext <math>\oplus</math> salt[64(n-1)..64n-1]) //as above Si[2n] <math>\gets</math> ctext[0..31] Si[2n+1] <math>\gets</math> ctext[32..63] return state
Для вычисления хеша bcrypt обрабатывает входные данные эквивалентно шифрованию 'eksblowfish(усиленный_ключ, input)':
bcrypt(cost, salt, key, input) state <math>\gets</math> EksBlowfishSetup(cost, salt, key) ctext <math>\gets</math> input repeat (64) ctext <math>\gets</math> EncryptECB(state, ctext) // шифрование стандартным Blowfish в режиме ECB return Concatenate(cost, salt, ctext)
В различных ОС (linux, OpenBSD), использующих алгоритм bcrypt в стандартной функции crypt (3), в качестве input подается константа «OrpheanBeholderScryDoubt»[3].
Недостатки
bcrypt был разработан в 1999 году и был защищен от эффективного перебора на аппаратных средствах того времени. В настоящее время получили широкое распространение ПЛИС, в которых bcrypt реализуется эффективнее. В 2009 был создан алгоритм scrypt, требующий для своей работы значительный объем памяти (со случайным доступом), объем памяти настраивается[4].
В сравнении с PBKDF2, алгоритм расширения ключа в bcrypt практически не исследовался криптографами[5].
См. также
Ссылки
- jBCrypt — реализация bcrypt на Java
- py-bcrypt — реализация bcrypt на Python
- BCrypt.Net- реализация bcrypt на C#
- JFBCrypt — реализация bcrypt на Objective C
- bcrypt-ruby — реализация bcrypt на Ruby
- Crypt::Eksblowfish::Bcrypt — реализация bcrypt на Perl
- bcrypt.js — реализация bcrypt на JavaScript
- twin-bcrypt — реализация bcrypt на JavaScript / asm.js
- bcrypt.go — реализация bcrypt на Go Шаблон:Wayback
- tutanota.com — пример использования bcrypt в сервисе end-to-end шифрованной почты
Примечания
- ↑ Шаблон:Статья
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html Шаблон:Wayback «Not only does scrypt give you more theoretical safety than bcrypt per unit compute time, but it also allows you to configure the amount of space in memory needed to compute the result.»
- ↑ http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html Шаблон:Wayback «Unlike bcrypt, PBKDF2 has been the subject of intense research and still remains the best conservative choice.»