Существует ли реализация bcrypt для Delphi?

Я пытаюсь найти bcrypt Реализация я могу использовать в Delphi. Единственная полезная вещь, которую Googling приносит мне, - это страница загрузки, содержащая переведенные заголовки для модуля winapi под названием bcrypt.h, Но когда я смотрю на функциональность, которую он обеспечивает, bcrypt.h не содержит никакого способа использовать алгоритм Blowfish для хеширования паролей!

Я нашел несколько реализаций bcrypt в C, из которых я мог бы собрать DLL и ссылаться на нее, за исключением того, что все они требуют *nix или специфичны для GCC, так что это тоже не будет работать!

Это Сорта везет меня вверх по стене. Я думаю, что было бы легко найти реализацию, но, похоже, это совсем не так. Кто-нибудь знает, где я мог получить один?

1 ответ

Итак, я написал это.

Использование:

hash: string;
hash := TBCrypt.HashPassword('mypassword01');

возвращает что-то вроде:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

Полезная вещь в этом хеше паролей в стиле (OpenBSD):

  • что он идентифицирует алгоритм (2a = bcrypt)
  • соль создается автоматически и отправляется с хешем (Ro0CUfOqk6cXEKf3dyaM7O)
  • параметр фактора стоимости также переносится с помощью хэша (10).

Чтобы проверить пароль правильно:

isValidPassword: Boolean;
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash);

BCrypt использует коэффициент стоимости, который определяет, сколько итераций потребуется для настройки ключа. Чем выше стоимость, тем дороже вычислять хеш. Постоянная BCRYPT_COST содержит стоимость по умолчанию:

const
   BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024)

В этом случае стоимость 10 означает, что ключ будет расширен и солен 2 10 = 1024 раунда. Это обычно используемый фактор стоимости на данный момент (начало 21 века).

Также интересно отметить, что по неизвестной причине хешированные пароли OpenBSD преобразуются в вариант Base-64, который отличается от Base64, используемого всеми остальными на планете. Так TBCrypt содержит пользовательский кодер и декодер base-64.

Также полезно отметить, что версия алгоритма хеширования 2a используется для обозначения:

  • Bcrypt
  • включить нулевой терминатор пароля в хэшированные данные
  • Unicode-строки имеют кодировку UTF-8

Так вот почему HashPassword а также CheckPassword функции принимают WideString (ака UnicodeString) и внутренне преобразовать их в UTF-8. Если вы используете это на версии Delphi, где UnicodeString является зарезервированным словом, а затем просто определить:

type
   UnicodeString = WideString;

я, как знает Дэвид Хеффернан, не владею Delphi XE 2. я добавил UnicodeString псевдоним, но не включал compilers.inc и определить прочь UnicodeString (так как я не знаю имя определения, и при этом я не мог проверить это). Что вы хотите от бесплатного кода?

Код состоит из двух блоков:

  • Bcrypt.pas (который я написал, со встроенными тестами DUnit)
  • Blowfish.pas (который написал Дейв Бартон, который я адаптировал, расширил, исправил некоторые ошибки и добавил тесты DUnit).

Где на intertubes я могу поместить некоторый код, где он может жить вечно?

Обновление 01.01.2015: Некоторое время назад оно было размещено на GitHub: BCrypt for Delphi.

Бонус 16.04.2015: теперь есть Scrypt для Delphi

Другие вопросы по тегам