1

ユーザーのパスワードを保存するには、SHA 256 + ソルティングを使用します。これらが正しいかどうかを確認したかっただけです。ビジネス要件として、パスワードは最小 8 入力、最大 32 入力である必要があります。(空白以外は任意の入力が有効です)

したがって、これらの要件を満たすための計画は次のとおりです。
フロントエンド - 32 の最大入力と 8 の最小入力を検証します。

バックエンド データベース (MySQL) スキーマは次のようになります:
pass_hash(64) CHAR - パスワード ハッシュを保存します
pass_slt(32) VARCHAR - 各ユーザーの一意のソルトを保存します

塩漬けについては、まだどの値を使用すればよいかわかりません。しかし、ユーザーがアカウントを作成するときに、ユーザーごとにランダムなキャラクターを作成して使用すると思います。次に、他の質問は次のとおりです。ソルトをプレーンテキストとして保存しますか、それともハッシュ/暗号化する必要がありますか?

また、それが問題かどうかはわかりませんが、この現在のプランでパスワードが多言語をサポートできるか、それとも何か問題が発生しますか? (アラビア語、中国語などのファンキーな文字について話している)

4

2 に答える 2

1

塩について:

ソルトは公開データです(機密情報であることが意図されている場合、「ソルト」ではなく「キー」と呼ばれます)。ソルトは、パスワードを検証するために既知である必要があります(パスワードとともにハッシュ関数に入るため)。これにより、意図したとおりにクリアテキストとして保存されます。

ソルトのポイントは、攻撃者が攻撃インスタンス間で攻撃コストを共有するのを防ぐことです。多くの場合、ユーザーが選択したパスワードを推測することは可能です(ユーザーは人間の頭脳しか持っておらず、複雑なパスワードを覚えるのが得意なことはめったにありません)。ソルトは、少なくとも、攻撃者が攻撃されたパスワードごとに、パスワード推測の全額を支払う必要があることを確認します(つまり、可能なパスワードの大きな辞書を「試行」します)。

ソルトは、パスワードごとに一意である限り、うまく機能します。ユーザーごとに一意ではないことに注意してください。ユーザーがパスワードを変更し、次のパスワードに同じソルトを使用したくない場合があります(そうしないと、攻撃者がある程度のコスト分担を利用できるようになります)。したがって、パスワードが保存されているとき、つまりアカウントが作成されたときやパスワードが変更されたときはいつでも、新しいソルトを選択する必要があります。

塩の一意性は、十分な大きさのランダムな塩を使用することで簡単に確保できます。そのためには32バイトのソルトで十分です。(運が悪か​​ったために)同じソルトを2回選択するリスクはごくわずかです。

ソルトを超えたセキュリティの追加レベルは、パスワードハッシュを「高価」にすることです。たとえば、(ソルトされた)パスワードをハッシュする場合、実際には、ソルト+パスワードシーケンスの10000倍の連結をハッシュします。これにより、パスワードの検証は、あなたと攻撃者の両方にとって10000倍の費用がかかります。多くの場合、正当なパスワード検証は、目立った影響なしに計算量を増やすことができます(1秒あたり100ユーザーのパスワードをチェックしても、100µsをそれに費やすことができ、処理時間の1%しか使用しません)。しかし、攻撃者にとって物事を10000倍難しくすることは良い考えです。

言語について:

非ASCIIパスワードの主な問題は、一部のグリフが複数のエンコーディングを使用する場合があることです。たとえば、「é」は、Unicodeを使用して、単一のコードポイント(U + 00E9 LATIN SMALL LETTER E WITH ACUTE)または2つのコードポイント(U + 0065 LATIN SMALLLETTEREの後にU+0301 COMBINING)としてエンコードできます。アキュートアクセント)。この例はかなり一般的なフランス語の手紙に関するものであり、中国語や韓国語ほど派手なものではないことに注意してください。エンコーディングの問題はUnicode正規化フォームで処理できますが、これは簡単なプログラミング作業ではありません。一部のプログラミング環境が役立ちます(たとえば、Javaでは、java.text.NormalizerUNFを実装するを使用します)。

また、キーボードを切り替えるユーザーは、ホテルや空港で共有コンピューターを使用する場合など、ASCII以外のパスワードを入力するのが難しい場合があります(このようなシステムで機密性の高いパスワードを入力することは、とにかく良い考えではありません)。

可能であればASCIIのみのパスワードを適用するか、それ以外の場合は箇条書きにすることをお勧めします。UNF(NFD形式)を実行してから、UTF-8エンコードを実行します。結果として得られるバイトのシーケンスは、ハッシュ段階に進むものです。

于 2010-11-03T13:51:32.290 に答える
-1

ソルトが固定長 (たとえば、常に 32 バイト) であることを除いて、これはほぼ正しいように見えます。ランダムでユーザーごとにする必要があることは正しいです。ソルトを暗号化することの本当の利点はわかりません。ソルトは、攻撃者がデータベースのクリアテキスト バージョンを既に持っている場合のシナリオを防御します。

多言語に関しては、アプリケーションで使用する文字エンコーディングと、 SHA-256 を正確に呼び出す対象について一貫性を保つ必要があります。

于 2010-11-03T06:09:34.827 に答える