Где 2x префикс используется в BCrypt?

Вопрос такой же, где $ 2x $ используется в BCrypt?

Следующий сценарий прав?

У нас есть набор паролей, хэшированных с префиксом $2a$ уже, когда версия сервера PHP была более ранней. 5.3.7 . Теперь мы обновили PHP до 5.3.7+ , теперь мы должны сначала проверить предыдущие пароли с алгоритмом $2x$ , а затем перефразировать пароль с префиксом $2y$ . Это верно?

Примечание для редакторов wikipedia : Содержание в этом ответе находится в общественном достоянии; Я знаю, потому что я это написал. Я написал это сначала для себя, а потом положил его на Stackoverflow. Я также знаю это, потому что все на Stackoverflow является copyleft. И даже если это не так, любой может свободно использовать его где угодно, в любое время, по любой причине, кем угодно. Откуда мне знать? Потому что я написал это, и я просто так сказал. Это включает запись Bcrypt в Википедии. В Википедии: Я жертвую.

Поэтому прекратите требовать нарушения авторских прав, когда вы не знаете, о чем говорите.

Варианты BCrypt

$ 2 $

BCrypt был разработан людьми OpenBSD. Он был разработан для хэш-паролей для хранения в файле паролей OpenBSD. Хешированные пароли хранятся с префиксом для идентификации используемого алгоритма. BCrypt получил префикс $2$ .

Это было в отличие от других префиксов алгоритма:

  • $1$ : MD5
  • $5$ : SHA-256
  • $6$ : SHA-512

$ 2a $

Исходная спецификация BCrypt не определяла, как обрабатывать символы, отличные от ASCII, или как обрабатывать нулевой терминатор. Спецификация была пересмотрена, чтобы указать, что при хешировании строк:

  • строка должна кодироваться в кодировке UTF-8
  • нулевой ограничитель должен быть включен

$ 2x $, $ 2y $ (июнь 2011 г.)

Ошибка была обнаружена в crypt_blowfish , в PHP-реализации BCrypt. Это были неправильные символы с 8-м битом.

Они предложили, чтобы системные администраторы обновили свою существующую базу паролей, заменив $2a$ на $2x$ , чтобы указать, что эти хэши плохо (и нужно использовать старый алгоритм). Они также предположили, что crypt_blowfish испускает $2y$ для хэшей, генерируемых фиксированным алгоритмом. Никто, включая канонический OpenBSD, не принял идею 2x / 2y . Этот маркер версии был ограничен crypt_blowfish .

Варианты $ 2x $ и $ 2y $ не «лучше» или «сильнее», чем $ 2a $ . Это остатки одной конкретной баггической реализации BCrypt.

$ 2b $ (февраль 2014 г.)

В реализации OpenBSD BCrypt обнаружена ошибка. Они сохраняли длину своих строк в unsigned char . Если пароль был длиннее 255 символов, он переполняется и завершается на 255.

BCrypt был создан для OpenBSD. Когда у них есть ошибка в их библиотеке, они решили, что это нормально. Это означает, что все остальные должны последовать примеру, если вы хотите оставаться в курсе «их» спецификации.

Версия $ 2b $ не «лучше» или «сильнее», чем $ 2a $ . Это остаток одной конкретной ошибки в использовании BCrypt. Но поскольку BCrypt канонически принадлежит OpenBSD, они могут изменить маркер версии на все, что захотят.

Нет никакой разницы между 2a , 2x , 2y и 2b . Если вы правильно написали свою реализацию, все они выдают один и тот же результат.

И если вы делали правильные вещи с самого начала (сохраняя строки в utf8, а также хешируя нулевой терминатор), тогда: нет разницы между 2 , 2a , 2x , 2y и 2b . Если вы правильно написали свою реализацию, все они выдают один и тот же результат.

Единственные люди, которым нужно заботиться о 2x и 2y, – это те, которые вы, возможно, использовали crypt_blowfish . И единственные люди, которым нужно заботиться о 2b, – это те, кто, возможно, запускал OpenBSD.

Все другие правильные реализации идентичны и правильны.