2012-03-14 23 views
14

私はDelphiで使用できるbcryptの実装を見つけようとしています。グーグルが私にもたらした唯一の有用なことについては、と呼ばれるwinapiユニットの翻訳ヘッダを含むthis download pageです。しかし、私が提供する機能を見ると、bcrypt.hは実際にBlowfishアルゴリズムを使用してパスワードをハッシュする方法を含んでいないようです!Delphiで利用できるbcryptの実装はありますか?

私はいくつかのbcryptの実装を見つけました。これらの実装は、* nixを必要とするか、またはGCC固有であるように見える以外は、DLLをビルドしてリンクすることができます。

これは私を壁に追い込んでくれます。実装を見つけるのは簡単だと思いますが、そうは思われません。誰かが私が1つを得ることができるか知っていますか?

+2

あなたはVistaで導入されたWindowsのbcryptを検討する準備ができていますか? JEDIにはヘッダーの翻訳があります:JwaBCrypt.pas –

+0

@David:これは質問で言及した 'bcrypt.h' winapiヘッダーのもう一つの翻訳です。実際にはBlowfishのパスワードハッシングの実装が含まれていないようです。 (または何かが欠落していますか?) –

+0

RudyさんのヘッダーはJEDIのヘッダーです。http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ –

答えて

18

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

使用法:

hash: string; 
hash := TBCrypt.HashPassword('mypassword01'); 

返しのようなもの:この(OpenBSDの)スタイルのパスワードハッシュに関する有用なことがある

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm 

  • それがアルゴリズムを特定していること(2a = bcrypt)
  • サルあなたのために自動的に作成され、ハッシュ(Ro0CUfOqk6cXEKf3dyaM7O
  • コストファクタのパラメータもハッシュ(10)と一緒に運ばれます。パスワードを確認するには

は正しいです:

isValidPassword: Boolean; 
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash); 

bcryptのは、キー設定がが行く反復回数を決定コスト要因を、使用しています。コストが高いほど、ハッシュを計算するのがより高価になります。

const 
    BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024) 

この場合10のコストは、キーが拡大し、2 10 = 1024回を塩漬けされることを意味します:定数BCRYPT_COSTは、デフォルトのコストが含まれています。これは、現時点で一般的に使用されているコスト要因です(初期21 st世紀)。

知られていない理由で、OpenBSDのハッシュパスワードは、地球上の他の人が使っているBase64とは異なるBase64の変種に変換されていることにも興味があります。したがって、TBCryptにはカスタムベース64エンコーダとデコーダが含まれています。

  • Unicode文字列をUTF-8には
  • をエンコードしているハッシュ化されたデータに

    • bcryptのパスワードのヌルターミネータを含める:

      これは、ハッシュアルゴリズムバージョン2aを意味するために使用されることに注意することも便利です

    だから、HashPasswordCheckPassword関数がWideString(別名UnicodeString)、内部でUTF-8に変換します。あなたはUnicodeStringが予約語であるデルファイのバージョンでこれを実行している場合は、単純に定義する:

    type 
        UnicodeString = WideString; 
    

    をI、デビッドHeffernanのは知っているとして、デルファイXE 2を所有していない私はUnicodeStringエイリアスを追加しましたcompilers.incは含まず、UnicodeStringを定義していません(定義名はわからないので、テストすることもできません)。あなたは無料コードから何を望みますか?デイブ・バートンは、iが適応され、書いた拡張、いくつかのバグを修正し、DUnitのを追加

    • Bcrypt.pas(どのIが埋め込まDUnitのテストで作成しました)
    • Blowfish.pas(:

      コードは、2つのユニットで構成テストする)。

    インターチューブではどこに永遠に生きていくことができるのでしょうか?

    更新1/1/2015:それは以前のGitHubに配置されました:BCrypt for Delphi

    ボーナス2015年4月16日:今bcryptのようScrypt for Delphi

    +2

    Perpetuity?本当にどこにもない。しかし、SourceForge、Google Code、GitHub、BitBucketは良い候補者です。 – afrazier

    +0

    答えのファイル名( 'bcrypt.pas'、' blowfish.pas')はpastebinにリンクしています。 –

    +0

    本当にこれをBitbucketに置いてください! –

    関連する問題