Серьезная проблема jBCrypt с checkpw (возвращает true, когда не должен?)

РЕДАКТИРОВАТЬ: Хорошо, поэтому я нашел ответ здесь -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)


person jfrobishow    schedule 30.05.2011    source источник


Ответы (2)


Итак, формулировка вопроса дала мне достаточно, чтобы понять, что я искал (ура для резинового уклонения< /а>). Область криптографии пока в безопасности!

Реализация BCrypt XOR с использованием P_orig, который представляет собой целое число 18 4 байта, пока не дойдет до конца, что ограничивает ваш «ключ» шифрования до 72 байтов. Все после 72 байт игнорируется (не помешало бы предупреждение).

То, что кажется принятым компромиссом, состоит в том, чтобы не ограничивать пароль пользователя 72 символами или меньше, а просто позволить ему пройти молча. Идея заключается в том, что 72-символьный пароль bCrypted в любом случае лучше, чем альтернатива быстрого хеширования.

Источник: BCrypt говорит долго, одинаковые пароли эквивалентны - проблема во мне, в геме или в области криптографии?

person jfrobishow    schedule 30.05.2011

На самом деле ваш собственный ответ великолепный и помог мне найти раздражающую проблему;) есть некоторый совет для людей, которые добавляют какой-то секрет приложения к простому перед хешированием (даже если они ограничивает длину пароля): включите секрет приложения в конец, особенно если длина секрета приложения составляет 72 символа, иначе каждое обращение будет возвращать true!

поэтому вместо этого:

String hashed = BCrypt.hashpw(APP_SECRET + plain, BCrypt.gensalt())

использовать:

String hashed = BCrypt.hashpw(plain + APP_SECRET, BCrypt.gensalt())

Даже если произойдет обрезка Bcrypt, результат checkpw будет действительным!

person biesior    schedule 08.11.2014