データベース内のパスワードを保護するための優れた単純な暗号化スキームは何ですか? 超安全なものや電光石火の速さは必ずしも必要ではありませんが、それらは素晴らしいものです。主に、ひどく遅くなったり安全でなかったりすることなく、簡単に実装できるものが欲しいだけです。
14 に答える
mk が言うように、SHA1 または MD5 は SHA2 とともに標準のものです。
更新: プロセッサが年々高速化するにつれて、ハッシュはよりブルート フォースになりやすくなっています。を使用することをお勧めしますbcrypt
。
必要なものは、より一般的には暗号化ハッシュ関数と呼ばれます。暗号化ハッシュは一方向になるように設計されています (結果のハッシュが与えられた場合、元の入力を導出することはできません)。また、任意の 2 つの文字列が同じハッシュを持つ (ハッシュ衝突と呼ばれる) 可能性は低くなければなりません (理想的には 1/ハッシュ値の数)。
残念ながら、パスワードがハッシュ化されているからといって、ハッシュ化されたバージョンを安全に保つために一生懸命努力する必要がなくなるわけではありません. あまりにも多くの人が、オフラインのブルート フォース攻撃に対して脆弱な脆弱なパスワードを使用します。
編集 - ソルトを使用することの重要性をすでに指摘している人もいます。ソルトは、ハッシュ関数を使用する前に入力と混合する定数値です。独自のソルトを持つことで、オフラインの攻撃者が事前に計算された一般的なパスワードのテーブル (レインボー テーブル) を使用して、パスワードをさらに高速にブルート フォース攻撃することを防ぎます。
MD5 または SHA1 を使用する場合は、salt を使用してレインボー テーブル ハックを回避してください。
C# では、これは簡単です。
MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );
簡単: BCrypt .
ジェフの「パスワードを間違って保存している可能性が高い」という記事は、このトピックに関する優れた読み物です。
それは数週間前の私の問題でした。私たちは大規模な 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 回の反復により、ブルート フォース攻撃のコストがかなり高くなります。- このリリースの時点で、SHA-256 に対して 2^128 操作未満の計算量で衝突を検出する既知の攻撃はありません。
実装:
- 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==
一意のソルトとともにSHA一方向ハッシュ アルゴリズムを使用します。これは、パスワードをデータベースに保存するために使用する主なアルゴリズムです。
セキュリティを強化するための鍵は、動的ソルトを使用することだと思います。これは、新しいユーザーごとにランダムな文字列を生成し、その文字列を使用してハッシュをソルトすることを意味します。もちろん、後でパスワードを確認できるように、このソルトをデータベースに保存する必要があります(私はパスワードを暗号化しません)。
ソリューションを将来的に保証したい場合は、SHA256 または SHA512 をお勧めします。Cryptographic Geekworld は、MD5 と、程度はやや低いものの SHA1 について不安を感じています。
または、可能であれば、SHA-3を待ちます
特にスタックオーバーフローで、パスワードハッシュを適切に行う方法について多くの混乱があることに気付きました。だから私はすべてを片付けるページを書きました。単純なハッシュを使用するよりも、もう少し多くのことが必要です。
SQL Server を使用している場合は、HashBytes 関数があります。
私は、MD5 または SHA に賛成票を投じます。主要な Web 開発言語のいずれにも、ハッシュを計算するための関数が組み込まれています (たとえば、PHP では、mcrypt パッケージに必要な関数が含まれています)。
上記で提案されている SHA-1 のような単方向ハッシュ アルゴリズムをソルトと共に使用する必要があります。詳細については、このサイトをお勧めします。いくつかのサンプル コード/実装が含まれています。 http://www.obviex.com/samples/hash.aspx
非可逆暗号化の場合、私は間違いなく SHA256 または SHA1 を使用します。現在、MD5 には非常に多くの衝突があり、それを壊すために多くの努力が払われているため、使用するのに適したものではありません。