ソルトハッシュ値はどこから取得する必要がありますか?


12

プレーンテキストで保存できないパスワードなどのハッシュ値にソルト値を追加する場合、ソルト値を取得するのに最適な場所はどこですか?コンテキストのために、これがWebページログインのパスワード用であると仮定します。


@DevArt、私はそれが非常に主観的な答えを必要とするため、ここでより適していると考えました。ソルト値はどこからでも取得できるため、「クライアントまたはサーバーからソルト値を取得する最も安全な場所はどこだと思いますか?」
モーガンハーロッカー

回答:


7

通常created TIMESTAMP、ユーザーテーブルに列があり、ユーザーがいつ登録されたかを確認できます。Saltに列を追加したくないので、タイムスタンプ列をsaltとして使用します。

SHA1(password + created)

次に、ユーザーが再度サインインしたときに、確認のために再ハッシュするときにユーザー名に基づいて日付を取得すると仮定していますか?
モーガンハーロッカー

1
@Prof:はい、塩の特定の列がある場合と同じように、その観点に違いはありません。
ジョナス

7

それは重要ですか?

塩には2つの目的があります。事前にハッシュされたパスワードの大きなテーブル(「レインボーテーブル」)を使用することは実用的ではなく、ハッシュのリストでは同一のパスワードが異なって見えます。同一のパスワードの外観を変えると、複数の人が特定のパスワードを使用するという問題を回避するのに役立ちます。

したがって、発生する可能性のある塩のグループが存在しないという意味で、各アカウントには独自の塩が必要であり、塩は過度に予測可能であってはなりません。(多くのサイトが1から始まり、カウントアップされた場合、悪者は、たとえば、低塩を含むレインボーテーブルを構築できます。)それらは、一般的に予測できない以外の意味でランダムである必要はありません。それらはハッシュ自体よりも秘密ではないので、特に推測する必要はありません。

便利な方法を使用して、ソルトを生成します。アカウントの数と比較して潜在的なソルト値が多数ある場合(初期のUNIXシステムは65536の可能性があるために2バイトを頻繁に使用していました)、セミランダム割り当ては重複したソルトをほとんど提供しませんでした。


1
私は一般に、ユーザー名、ソルト、パスワードを連結し、文字列全体をハッシュ化することで解決される2番目の問題-同一のパスワードが異なるように見える-を見てきました。これにより、アカウントごとに一意のソルトを生成する必要がなくなります。
ジャスティンケーブ

1
@Justin:興味深いことに、ハッシュの一部として使用されるユーザー名を見たことがありませんでしたが、それは確かにエントロピーを追加する良い方法です。ただし、生成にそれほど費用がかからないという理由だけで、私はまだ擬似ランダムソルトを使用します。
マチューM.

2
@Matthieuどこかに格納する必要があるという欠点と、トランザクションの両側で必要な場合は、送信する必要もあります。ユーザー名があれば、双方はすでにそれを知っています。
マシューフレデリック

2
@Justin:この場合、ユーザー名をソルトとして使用しています。それはソルトの両方の目的に答えます:レインボーテーブルを非実用的にすることと、類似のパスワードを異なるように見せることです。
デビッドソーンリー

@David-確かに、ユーザー名がソルトの一部になるとみなすことができます。攻撃者がレインボーテーブルを使用してユーザー名とパスワードの組み合わせを見つけることができないように、追加のソルトが必要です。明示的なソルトがない場合、攻撃者がレインボーテーブルから必要とする文字列のサイズをユーザー名の長さ(これは短く、完全に小文字または完全に大文字である可能性が高い)だけ増やします。攻撃者がサイト固有のレインボーテーブルを生成できるほどサイトが大きくない限り、レインボーテーブル攻撃を阻止するには一定のソルトで十分です。
ジャスティン洞窟

3

新しいパスワード(登録、パスワードリセット、パスワード更新)を保存するたびに、1つの良い方法があります。

  • 新しい塩を生成する
    • 暗号的に安全な擬似乱数ジェネレータを使用する
    • 適切なサイズのソルトを使用します-適切な値は、基礎となるハッシュアルゴリズムのブロックサイズです(SHA-256の場合があります)
  • 新しいパスワードトークンを生成する
    • saltをhmacキーとして使用して、基礎となるハッシュアルゴリズム(SHA-256である可能性があります)からhmac関数を作成します
    • for i in (0...65536) { password = hmac(password) }
    • hmac関数の反復アプリケーションの結果はパスワードトークンです
  • saltとパスワードトークンを保存する
    • 元のパスワードを保存しないでください
    • オプションで、基礎となるハッシュアルゴリズムと検出可能性のストレッチを保存する

1

フレームワークを活用します。.NETではRNGCryptoServoiceProviderを使用できます...

        // If salt is not specified, generate it on the fly.
        if (saltBytes == null)
        {
            // Define min and max salt sizes.
            int minSaltSize = 4;
            int maxSaltSize = 8;

            // Generate a random number for the size of the salt.
            Random  random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Allocate a byte array, which will hold the salt.
            saltBytes = new byte[saltSize];

            // Initialize a random number generator.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Fill the salt with cryptographically strong byte values.
            rng.GetNonZeroBytes(saltBytes); 
        }

他のフレームワークには、利用できる類似のクラスが必要です。ランダム性を実現するために、ソフトウェアはしばしばRandom上記のようにユーザーを採用します。定義された領域内でマウスをランダムに動かして塩を提供することは、TrueCryptで採用されているオプションです。具体的には、特定のニーズとセキュリティレベルに応じて異なります。あなたの塩は単純にできるから!@#$%です。


1

saltサーバー側を生成し、作成時にユーザーアカウントに割り当てます。フレームワークで利用可能な暗号生成APIを使用することをお勧めしますが、原則としてどのシーケンスでも使用できます。

通常、物は次のように保存されます。

User
-------------------
ID
Username
PasswordHashWithSalt

例:

PasswordHashWithSalt =

A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q


何に基づいて割り当てますか?ユーザーが作成後にサインインしたときに複製できるように、所定の値に由来する必要はありませんか?
モーガンハーロッカー

「割り当て」とは、ユーザー名/パスワードのペア(アカウント)ごとにソルトを生成し、データベースに保存することを意味します。ログインを実行する必要がある場合、保存されたソルトを使用して物事を確認します。

1

bcryptを使用して、この記事を読んでください。通常のハッシュだけでは、今日の時代では深刻な保護ではありません。

オープンソースライブラリが豊富にあり、特許も含まれていないSDRゼロナレッジパスワードプロトコルの使用を検討してください。

SDRにはソルトが必要であり、それを取得するのに最適な場所はクライアントです。キーストローク、マウスの動き、環境変数、乱数、一時フォルダー内のファイル作成時間をハッシュし、サーバーから予測できない方法で最後にソルトを作成します。SDRは、ソルト、大きな素数、ユーザーパスワードを取得し、検証キーを生成します。パスワードを保存せずにマシンから離れることはありませんが、検証キーとソルトに対応するパスワードを持っていることを確認できます。中間者や辞書攻撃の影響を受けません。念のために、データベース列のキーとソルトを暗号化します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.