Хорошо, я написал это.
Использование:
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