Хорошо, поэтому я написал его.
Использование:
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
Готовы ли вы рассмотреть Windows-шифр, введенный в Vista? JEDI имеет трансляцию заголовка: JwaBCrypt.pas –
@David: Это, как представляется, еще один перевод заголовка 'bcrypt.h' winapi, который я упомянул в вопросе, тот, который на самом деле не содержит в себе реализацию хэширования Blowfish , (Или я что-то не хватает?) –
Заголовок Rudy является источником JEDI, http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ –