Где 2x префикс используется в BCrypt?
Вопрос с тем же названием, где $2x$ используется в BCrypt?
Следующий сценарий прав?
У нас есть набор паролей, которые хэшируются $2a$
префикс уже, когда версия сервера PHP была ранее 5.3.7
, Теперь мы обновили PHP до 5.3.7+
, теперь мы должны сначала проверить предыдущие пароли с $2x$
алгоритм затем перефразировать пароль с $2y$
префикс. Вот так?
1 ответ
Примечание для редакторов Википедии: Содержание этого ответа находится в свободном доступе; Я знаю, потому что я написал это. Сначала я написал это для себя, а потом поместил в Stackru. Я также знаю это, потому что все на Stackru является 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. Когда у них есть ошибка в их библиотеке, они решили, что все в порядке, чтобы поднять версию. Это означает, что все остальные должны последовать их примеру, если вы хотите оставаться в курсе "своих" спецификаций.
- http://undeadly.org/cgi?action=article&sid=20140224132743
- http://marc.info/?l=openbsd-misc&m=139320023202696
Версия $2b$ не "лучше" и не "сильнее", чем $ 2a $. Это остаток одной конкретной ошибочной реализации BCrypt. Но поскольку BCrypt канонически принадлежит OpenBSD, они могут изменить маркер версии на любой другой.
Нет никакой разницы между 2a, 2x, 2y и 2b. Если вы написали свою реализацию правильно, они все выдают одинаковый результат.
И если вы с самого начала поступали правильно (сохраняя строки в utf8, а также хэшируя нулевой терминатор), то: нет никакой разницы между 2, 2a, 2x, 2y и 2b. Если вы написали свою реализацию правильно, они все выдают одинаковый результат.
Единственные люди, которым нужно заботиться о 2х и 2й, это те, кого вы, возможно, использовали crypt_blowfish. И единственные люди, которым нужно заботиться о 2b, это те, кто, возможно, работал с OpenBSD.
Все остальные правильные реализации идентичны и правильны.