РЕДАКТИРОВАТЬ: Хорошо, поэтому я нашел ответ здесь -gem-or">BCrypt говорит, что длинные похожие пароли эквивалентны - проблема во мне, в геме или в области криптографии?
Новый вопрос, однако, как кто-то может рекомендовать использовать bCrypt для хеширования, если вам нужно ограничить длину пароля пользователя в мире, где мы пытаемся научить пользователей выбирать все более сложные пароли, даже парольную фразу, говоря, что ваш пароль должен быть короче n символов похоже на способ попасть на пятничные скриншоты thedailywtf.com :)
Оригинальный вопрос ниже:
Я занимаюсь рефакторингом старой страницы входа в приложение и решил попробовать bCrypt, используя реализацию JAVA jBCrypt (http://www.mindrot.org/projects/jBCrypt/) и столкнулся с одной серьезной проблемой.
Проблема связана с методом checkpw, который всегда возвращает true при использовании очень длинного начального числа. Я собирался солить пароль пользователя с помощью {InternalSalt}{username}{password}, а затем хешировать его с помощью bCrypt.
Итак, у меня есть следующий код (урезанный настолько, насколько это возможно, чтобы изолировать checkpw).
public class Test {
public static void main(String[] args) {
String plaintext = "jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN";
String pw_hash = BCrypt.hashpw(plaintext, BCrypt.gensalt());
if (BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN", pw_hash))
System.out.println("It matches");
else
System.out.println("It does not match");
}
}
Это, как и должно быть, напечатает «Соответствует».
Проблема, с которой я сталкиваюсь, заключается в том, что вы добавляете, скажем, aaa к паролю, который вы передаете для проверки pw, делая его
BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKNaaa", pw_hash)
Он по-прежнему возвращает true! Не совсем то, что я ожидал. Я не вижу каких-либо ограничений длины пароля в документе, но я не могу воспроизвести его с меньшим начальным числом пароля, также похоже, что если я изменяю что-либо еще, кроме конца строки, он работает, как и ожидалось, возвращая false.
Я пропустил что-то важное? Я знаю, что я не должен быть единственным, кто использует jBcrypt на этом форуме, поскольку я видел, что BCrypt рекомендуется во многих сообщениях, когда я проводил некоторые исследования.
РЕДАКТИРОВАТЬ: 64-разрядная версия Windows 7 - Java(TM) SE Runtime Environment (сборка 1.6.0_24-b07)