さて、私はそれを書きました。
使用法:
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
=1,024 ラウンド。これは、現時点 (21 世紀初頭) で一般的に使用されるコスト要因です。
理由は不明ですが、OpenBSD のハッシュ化されたパスワードは、地球上の他のすべての人が使用する Base64 とは異なる Base-64 バリアントに変換されることにも注意してください。そのTBCrypt
ため、カスタム Base-64 エンコーダーとデコーダーが含まれています。
2a
ハッシュ アルゴリズムのバージョンは、次の意味で使用されることにも注意してください。
- bcrypt
- ハッシュ化されたデータにパスワードの null ターミネータを含める
- Unicode 文字列は UTF-8 でエンコードされています
そのため、関数HashPassword
とCheckPassword
関数はWideString
(aka UnicodeString
) を受け取り、内部でそれらをUTF-8に変換します。UnicodeString
が予約語であるバージョンの Delphi でこれを実行している場合は、次のように定義するだけです。
type
UnicodeString = WideString;
私は、David Heffernan が知っているように、Delphi XE 2 を所有していません。UnicodeString
エイリアスを追加しましたが、含めcompilers.inc
たり定義したりしませんでしたUnicodeString
(定義名がわからず、テストもできなかったため)。フリーコードに何を求めますか?
コードは次の 2 つのユニットで構成されます。
- Bcrypt.pas (私が書いたもので、DUnit テストが埋め込まれています)
- Blowfish.pas (Dave Barton が書いたもので、私が適応、拡張、いくつかのバグを修正し、DUnit テストを追加しました)。
インターチューブのどこに、永続的に存在できるコードを配置できますか?
2015 年 1 月 1 日更新: 少し前に GitHub に配置されました: BCrypt for Delphi。
ボーナス 2015 年 4 月 16 日: Delphi 用の Scryptが追加されました