Может ли кто-нибудь объяснить, как BCrypt проверяет hash?

Я использую C # и BCrypt.Net для хеширования своих паролей.

Например:

string salt = BCrypt.Net.BCrypt.GenerateSalt(6); var hashedPassword = BCrypt.Net.BCrypt.HashPassword("password", salt); //This evaluates to True. How? I'm not telling it the salt anywhere, nor //is it a member of a BCrypt instance because there IS NO BCRYPT INSTANCE. Console.WriteLine(BCrypt.Net.BCrypt.Verify("password", hashedPassword)); Console.WriteLine(hashedPassword); 

Как BCrypt проверяет пароль с помощью hashа, если он не сохраняет соль в любом месте. Единственная идея, которую я имею, это то, что она каким-то образом добавляет соль в конце hashа.

Это правильное предположение?

2 Solutions collect form web for “Может ли кто-нибудь объяснить, как BCrypt проверяет hash?”

Как BCrypt проверяет пароль с помощью hashа, если он не сохраняет соль в любом месте?

Ясно, что это не делает ничего подобного. Соль нужно где-то спасти.

Давайте посмотрим на схемы шифрования паролей в Википедии. С http://en.wikipedia.org/wiki/Crypt_(Unix) :

Результат функции – это не просто hash: это текстовая строка, которая также кодирует соль и идентифицирует используемый hash-алгоритм.

В качестве альтернативы, ответ на ваш предыдущий вопрос по этому вопросу включал ссылку на исходный код . Вместо того, чтобы просить интернет прочитать исходный код для вас, вы всегда можете сами его прочитать. Скорее всего, ваш ответ будет быстрее. Соответствующий раздел исходного кода:

  StringBuilder rs = new StringBuilder(); rs.Append("$2"); if (minor >= 'a') { rs.Append(minor); } rs.Append('$'); if (rounds < 10) { rs.Append('0'); } rs.Append(rounds); rs.Append('$'); rs.Append(EncodeBase64(saltBytes, saltBytes.Length)); rs.Append(EncodeBase64(hashed,(bf_crypt_ciphertext.Length * 4) - 1)); return rs.ToString(); 

Очевидно, что возвращаемая строка представляет собой информацию о версии, за которой следует количество используемых раундов, за которым следует соль, закодированная как base64, а затем hash, закодированный как base64.

Строка hashа BCrypt выглядит так:

 $2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm $==$==$======================------------------------------- 

где

  • 2a : Алгоритм Идентификатор (BCrypt, UTF8 закодированный пароль, null завершен)
  • 10 : Фактор затрат (2 10 = 1024 раунда)
  • Ro0CUfOqk6cXEKf3dyaM7O : Ro0CUfOqk6cXEKf3dyaM7O OpenBSD-Base64 (22 символа, 16 байт)
  • hSCvnwM9s4wIX9JeLapehKK5YdLxKcm : кодировка с кодировкой OpenBSD-Base64 (31 символ, 24 байта)

Редактировать : я просто заметил, что эти слова подходят точно. я должен был поделиться:

 $2a$10$TwentytwocharactersaltThirtyonecharacterspasswordhash $==$==$======================------------------------------- 

BCrypt создает 24-байтовый двоичный хеш с использованием 16-байтовой соли. Вы можете хранить двоичный hash и соль, как вам нравится; ничто не говорит о том, что вам нужно, чтобы base-64 закодировал его в строку.

Но BCrypt был создан парнями, которые работали над OpenBSD. OpenBSD уже определяет формат для своего файла паролей:

$ [HashAlgorithmIdentifier] $ [AlgorithmSpecificData]

Это означает, что «спецификация bcrypt» неумолимо связана с файлом файла паролей OpenBSD. И всякий раз, когда кто-либо создает «hashирование bcrypt», они всегда преобразуют его в строку ISO-8859-1 формата:

$ 2a $ [Cost] $ [Base64Salt][Base64Hash]

Несколько важных моментов:

  • 2a – это идентификатор алогита
    • 1: MD5
    • 2: ранний bcrypt, у которого была путаница, по которой кодируются пароли (устаревшие)
    • 2a: текущий bcrypt, который определяет пароли как кодированные UTF-8
  • Стоимость – это фактор затрат, используемый при вычислении hashа. «Текущее» значение равно 10, что означает, что настройка внутреннего ключа проходит через 1024 раунда
    • 10: 2 10 = 1,024 итерации
    • 11: 2 11 = 2,048 итераций
    • 12: 2 12 = 4 096 итераций
  • алгоритм base64, используемый файлом паролей OpenBSD, – это не то же самое кодирование Base64, которое использует все остальные ; у них есть свои:

     Regular Base64 Alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ BSD Base64 Alphabet: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 

    Таким образом, любые реализации bcrypt не могут использовать встроенную или стандартную библиотеку base64


Вооружившись этими знаниями, вы можете теперь проверить пароль correctbatteryhorsestapler против сохраненного hashа:

 $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km 
  • Как объявить глобальную переменную в C ++
  • Как принудительно распространять изменения роли для пользователей с помощью ASP.NET Identity 2.0.1?
  • Как сериализовать объект Exception в C #?
  • В чем разница между общим проектом и библиотекой classов в Visual Studio 2015?
  • Тип Nullable не является нулевым типом?
  • Что такое fragmentация памяти?
  • Как сделать снимок экрана с помощью элемента управления WPF?
  • Почему целочисленное переполнение на x86 с GCC вызывает бесконечный цикл?
  • Войдите на сайт, через C #
  • Как читать встроенный текстовый файл ресурсов
  • не работает в Opencv
  • Давайте будем гением компьютера.