Существует ли реализация 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