Доступна ли реализация bcrypt для Delphi? - PullRequest
14 голосов
/ 15 марта 2012

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

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

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

1 Ответ

20 голосов
/ 04 мая 2012

Хорошо, я написал это.

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

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

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

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

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

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

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

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

BCrypt использует коэффициент cost , который определяет, сколько итераций будет проходить установка ключа.Чем выше стоимость, тем дороже вычислять хеш.Константа 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
  • включает нулевой терминатор пароля в хэшированные данные
  • Юникодные строки имеют кодировку UTF-8

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

type
   UnicodeString = WideString;

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

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

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

Где на промежутках можноя положил какой-нибудь код, где он может жить вечно?

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

Бонус 4/16/2015 : теперь есть Scrypt для Delphi

...