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

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

Возможна следующая сценария:

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

Ответ 1

Примечание для редакторов Википедии: Содержание этого ответа находится в свободном доступе; Я знаю, потому что я написал это. Сначала я написал это для себя, а потом поместил в 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 emit $2y$ для хэшей, сгенерированных фиксированным алгоритмом. Никто другой, включая канонический OpenBSD, не принял идею 2x/2y. Этот маркер версии был ограничен crypt_blowfish 🕗.

Версии $ 2x $ и $ 2y $ не "лучше" и не "сильнее", чем $ 2a $. Они являются остатками одной конкретной ошибочной реализации BCrypt.

2 миллиарда долларов США (февраль 2014 года)

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

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

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

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

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

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

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