16

bcryptDelphi で使用できる実装を探しています。グーグルが私にもたらす唯一の有用なものは、このダウンロードページbcrypt.hです. しかし、それが提供する機能を見るとbcrypt.h、Blowfish アルゴリズムを使用してパスワードをハッシュする方法が実際には含まれていないようです!

C で DLL をビルドしてリンクできるいくつかの bcrypt 実装を見つけましたが、それらはすべて *nix を必要とするか、GCC 固有であると思われるため、どちらも機能しません!

これは私を壁に追いやるようなものです。実装を見つけるのは簡単だと思いますが、そうではないようです。どこで入手できるか知っている人はいますか?

4

1 に答える 1

24

さて、私はそれを書きました。

使用法:

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 でエンコードされています

そのため、関数HashPasswordCheckPassword関数は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が追加されました

于 2012-05-04T02:08:23.950 に答える