それは数週間前の私の問題でした。私たちは大規模な MIS プロジェクトを 975 の異なる地理的な場所に展開していました。そこでは、独自のユーザー資格情報ストアが、実装済みおよび使用中のさまざまなアプリケーションの認証システムとして使用されます。すでに REST ベースと SOAP ベースの両方の認証サービスを提供していましたが、顧客は、関連するテーブルまたはビューの読み取り専用ビューへの DB 接続だけで、他のアプリケーションからユーザー資格情報ストアに到達できると主張しました。ため息... (この高度に結合された悪い設計上の決定は、別の質問の対象です)。
そのため、ソルト化され、反復的にハッシュ化されたパスワード ストレージ スキームを座って仕様に変換し、簡単に統合できるようにいくつかの異なる言語の実装を提供する必要がありました。
私たちはこれを Fairly Secure Hashed Passwords または略してFSHPと呼びました。Python、Ruby、PHP5 で実装し、Public Domain にリリースしました。http://github.com/bdd/fshpの GitHub で、消費、フォーク、フレーム化、または吐き出すことができます
FSHP はソルト化され、反復的にハッシュされたパスワード ハッシュの実装です。
設計原理は、RFC 2898 の
PBKDF1仕様(別名: PKCS #5: パスワードベースの暗号化仕様バージョン 2.0)と
似ています。 (256、384、512)。すべての出力の先頭にある自己定義のメタ プレフィックスにより、コンシューマが独自のパスワード ストレージ セキュリティ ベースラインを選択できるようにしながら、ポータブルになります。
セキュリティ:
デフォルトの FSHP1 は 8 バイトのソルトを使用し、SHA-256 ハッシュを 4096 回繰り返します。- 8 バイトのソルトは、必要なスペースを 2^64 で乗算することにより、レインボー テーブル攻撃を非現実的にします。- 4096 回の反復により、ブルート フォース攻撃のコストがかなり高くなります。- このリリースの時点で 2^128 操作未満の計算量で衝突を検出する SHA-256 に対する既知の攻撃はありません。
実装:
- Python: 2.3.5 (w/hashlib)、2.5.1、2.6.1 でテスト済み
- Ruby : 1.8.6 でテスト済み
- PHP5 : 5.2.6 でテスト済み
不足している言語の実装を作成したり、現在のものを改良したりすることは、誰でも大歓迎です。
基本操作(Python を使用) :
>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True
クリプトのカスタマイズ:
パスワードハッシュスキームを弱めましょう。- ソルトの長さをデフォルトの 8 から 2 に減らします。 - 反復ラウンドをデフォルトの 4096 から 10 に減らします。 - 基礎となるハッシュ アルゴリズムとして SHA-1 で FSHP0 を選択します。
>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==