他の数人との議論の中で、私は次の議論を読みました。
- sha512(salt + ユーザー名 + パスワード) はダメです。
- sha512(ユーザー名 + パスワード) の方が悪く、
- sha512(パスワード) はばかげています。
私も部分的に同意しますが、本当に最高のセキュリティとは何でしょうか? SHA512 などの遅いハッシュ方法と一緒にユーザー固有のソルトを使用するよりも安全なものはありますか? 本当の行き方は?議論してください!
タイトルが悪いと思ったら編集してください。
「全体的な」アルゴリズムとは、平文のパスワードを保存された値に変換する方法の完全な定義を意味します。例SHA-256("mypassword" + "[[" + 40-char-random-alphanum-salt + "]]")
。角括弧の代わりに山括弧を使用するように変更すると、保存されたパスワードを悪用するために必要なレインボー テーブルが変更されます。独自のハッシュ アルゴリズムを作成することを推奨しているわけではないことに注意してください。それでも、暗号的に安全なハッシュ アルゴリズムを選択する必要があります。
MD5 の作成者によるこの記事を参照してください。彼は、私が上で繰り返した 2 つの要点を述べています。1) 高速ハッシュ アルゴリズムを使用する場合、要点を見逃していること、および 2) 全体的なアルゴリズムの再利用により、レインボー テーブルの再利用が可能になることです。
最近の LinkedIn のリークについて話し合っているときに、誰かがbcrypt に関するこのリンクを持ち出しました。私は同意すると思います...係数に応じて計算時間を指数関数的に増加させる関数を使用する必要があります。それが、クラスターや GPU を使用してハッシュ計算を行おうとする人々に打ち勝つ唯一の方法です。
私の理解では、(計算コストのための)繰り返しのハッシュと適切なランダムソルトは、真剣に決定された暗号攻撃者を除くすべてを打ち負かすはずです.
データベース内およびネットワーク上でパスワードをハッシュすることで、スヌーパーや侵入した攻撃者がプレーンテキストを回復可能 (および他の場所で使用可能) にすることを回避できます。
基本的に、これは多かれ少なかれ、Wordpress 認証で使用されるスキームです。
var SALT = 64 random characters;
var NUM_HASHES = about 1000; // can be randomized
var hashedResult = inputPassword;
for (int i = 0; i < NUM_HASHES; i++) {
var dataToHash = SALT + hashedResult;
hashedResult = secureHash( dataToHash);
}
//... can now store or send.
このランダム ソルトとループ ハッシュの使用は、レインボー テーブルまたは単一レベルの「ハッシュ衝突」、「ハッシュの弱点」攻撃を打ち負かします。ハッシュ関数の1000回の反復による各キーの完全なキースペースのブルートフォースのみが、それを打ち負かすと考えられています:)