2012-03-14 6 views
14

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

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

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

+2

Готовы ли вы рассмотреть Windows-шифр, введенный в Vista? JEDI имеет трансляцию заголовка: JwaBCrypt.pas –

+0

@David: Это, как представляется, еще один перевод заголовка 'bcrypt.h' winapi, который я упомянул в вопросе, тот, который на самом деле не содержит в себе реализацию хэширования Blowfish , (Или я что-то не хватает?) –

+0

Заголовок Rudy является источником JEDI, http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ –

ответ

18

Хорошо, поэтому я написал его.

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

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

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

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

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

  • , что он идентифицирует алгоритм (2a = bcrypt)
  • sal t автоматически создается для вас и отправляется с хешем (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 = 1 024 раундов. Это часто используемый фактор затрат на данный момент времени (начало 21 st век).

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

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

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

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

type 
    UnicodeString = WideString; 

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

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

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

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

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

Bonus 4/16/2015: Существует в настоящее время Scrypt for Delphi

+2

Perpetuity? Нигде не было. Но SourceForge, Google Code, GitHub или BitBucket являются хорошими кандидатами, которые должны быть достаточно долгое время. – afrazier

+0

Пока имена файлов в ответе ('bcrypt.pas',' blowfish.pas') ссылаются на pastebin. –

+0

Действительно, положите это на битбакет! –

Смежные вопросы