アプリケーションにパスワードを保存するためにscrypt
を使用します。そのため、私はSHA-256およびSalsa20暗号プリミティブ(およびPBKDF2)を使用します。
それを念頭に置いて、私はどのくらいの塩を使うべきですか?それはSHA-256出力のサイズに等しい必要があります:256ビット、またはこのパスワード拡張機能から取得するビット数に等しい必要があります:512ビット?
OpenLDAPで使用されるSSHAには32ビットのソルトしかなく、Linux crypt()は48ビットのソルトを使用することを考えると、私のソルトはかなり大きく見えるでしょう...
一般的に:塩のサイズの目安は何ですか?
関連:
塩は一意でなければなりません;それが彼らの唯一の仕事です。ソルト値を再利用しないように、できるだけ努力する必要があります。時々の再利用はめったにありませんcriticalですが、それでも避けてください)。合理的に設計されたパスワードスキームでは、saltには一意性以外に役立つプロパティはありません。まったく同じビットシーケンスを再現しない限り、必要に応じてそれらを選択できます。独自性は世界中で理解されなければなりません。
(不適切に設計されたパスワードハッシュスキームでは、saltにいくつかの追加プロパティが必要になる場合がありますが、不適切に設計されたパスワードスキームを使用すると、すでに大きな問題が発生します。saltは 初期化ベクトル 対称暗号化。通常、予測できない均一なランダム性などの厳しい要件が適用されます。)
多かれ少なかれユニークなソルト値を持つ(= /// =)一般的な方法は、ランダムに生成し、優れたジェネレーター(たとえば、/dev/urandom
)。ソルトが十分に長い場合、衝突(つまり、ソルト値の再利用)のリスクは低くなります。 nビットソルトを使用する場合、約2に到達すると、衝突の可能性は無視できなくなりますn/2生成された値。この地球上には約70億人の人々がおり、平均してそれぞれ1000個未満のパスワードを所有していると考えるのは安全なようです。そのため、ハッシュされたパスワードの世界的な数は2よりやや低くなければなりません。42.7。したがって、86ビットの塩で十分です。いわゆる「セキュリティマージン」が好きなので、さらに、プログラマはlove2のべき乗なので、128に行きましょうビット。上記の分析によると、これは十分に高い確率で世界的な一意性を保証するのに十分であり、一意性よりも塩に求められるものは他にありません。
一意性は、他の手段(例:サーバー名の連結(全世界のDNSシステムにより、地球上の他の誰とも異なる独自のサーバー名を取得できることが保証されています)とサーバー全体のカウンターをソルトとして使用します。これにより、いくつかの実用的な問題が発生します。サーバーがクラッシュして再起動したり、ロードバランシングを備えた複数のフロントエンドが発生したりした場合でも、繰り返されないカウンター値を維持します。ランダムな固定長ソルトは簡単です。
「それは少なくとも8オクテット(64ビット)の長さでなければなりません。」から: http://www.ietf.org/rfc/rfc2898.txt