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