4

私はNHibernateを使用しており、データベースでパスワードを暗号化するためのカスタムタイプを持っているので、文字列プロパティを使用してパスワードを表すことができますが、NHibernateはデータベースに保存する前に値を変換/暗号化します. 現在、設定ファイルにソルト値と暗号化キーを保存していますが、実際にはパスワード ハッシュに移行したいと考えています。ただし、カスタム NHibernate 型は、処理するように指示されているプロパティの値以外に、格納されているオブジェクトについて何も知らないため、ランダムなソルトを生成して、このカスタム型内から別のプロパティにオブジェクトと共に格納することはできません。 .

ソルトを個別に保存することはできないので、パスワード自体からソルトを導出し、2 つの組み合わせをハッシュしてもよいのではないかと思います。たとえば、パスワードを取得し、MD5 ハッシュしてから、MD5 ハッシュをソルトとして使用します。これでよろしいでしょうか?これにより、パスワードごとに一意の (ただし派生した) ソルト値を使用しながら、決定論的な方法でパスワードを永続化できますが、この方法で行う場合にセキュリティ上の考慮事項はありますか?

編集:

これまでに受け取ったすべての回答は、質問のコンテキストを説明できていないため、NHibernate 用語で定義されたメソッドのシグネチャを提示させてください。

public override void Set(IDbCommand cmd, object value, int index)
{
    var param = (IDataParameter)cmd.Parameters[index];

    if (value == null)
    {
        param.Value = null;
    }
    else
    {
        var temp = value.ToString();
        var encrypted = encryptor.Encrypt(temp);
        param.Value = encrypted;
    }
}

それがNHibernateが私に与えるすべてです。IDbCommand オブジェクト、値、およびパラメーター インデックスを受け取ります。パラメータ自体や、永続化されるオブジェクトのタイプについては何も知りません。私には価値しかありません。ランダムなソルトを生成して別のプロパティに保存することはできません。これは、永続化されるオブジェクトに存在するプロパティや、パラメーター コレクションに保存される順序がわからないためです。私の目標は、このメソッド呼び出しのコンテキスト内で可能な限り安全な方法でパスワードをハッシュすることです。私の提案に異議を唱える場合は、このコンテキスト内で別のアイデアを受け取ると役に立ちます。

4

4 に答える 4

5

いいえ!パスワードからソルトを導出すると、同じパスワードはすべて同じハッシュを持ち、ソルトは役に立たなくなります。

試してみてください

var temp = value.ToString();
var salt = generateRandonSalt();
var encrypted = encryptor.Encrypt(temp + salt);
param.Value = salt + encrypted;

「+」とは、連結オペランドまたは値と互換性のあるものを意味します。そして当然、次回パスワードを確認できるように、ソルトの長さを常に知る必要があります。

于 2012-04-07T04:24:27.243 に答える
4

ハッシュ関数の目的は、パスワードから何かを引き出すことです。パスワードからソルトを導出する場合、その導出は事実上ハッシュ関数の一部です。ハッシュ関数を変更/拡張したばかりで、実際にはソルトがありません。

塩はランダムでなければなりません。

彼らの仕事は、パスワードを総当たり攻撃しにくくすることです。ソルトに65536の異なる値がある場合(たとえば)、同じパスワードが65536の異なる方法でハッシュできることを意味します。誰かがハッシュをパスワードに戻す辞書を作成したい場合、彼の辞書は1つのパスワードに対して65536エントリを必要とします。

このアイデアが機能するためには、ソルトはパスワードとは何の関係もないはずです。

于 2012-04-07T04:30:39.313 に答える
1

あなたの例の問題は、攻撃者が一致するものを見つけたい場合、すべてのパスワードがmd5クーターパーツによってソルトされるレインボーテーブルを作成する可能性があることです。

ハッカーがmd5とすべての可能な塩のすべての可能な組み合わせのリバースエンジニアリングされたテーブルを持たなければならないように、塩はエントリごとに一意である必要があります。

于 2012-04-07T04:30:27.800 に答える
0

ソルトのようなスキームの目的が、事前に決定されたハッシュを使用して辞書攻撃に対してパスワードを耐性にすることである場合、そのアプローチはソルトなしのハッシュよりも少し安全かもしれませんが、有効なソルトを使用するほど安全ではありません。

有効なソルトの重要なセキュリティ上の利点の 1 つは、同じパスワードの 2 つのインスタンスが 2 つの異なるハッシュを生成することです。あなたのスキームでは、あるユーザーのパスワードとハッシュを知ることで、攻撃者は同じハッシュを持つ別のユーザーの同じパスワードを推測することができます。

于 2012-04-07T04:54:35.623 に答える