我使用 NHibernate 并有一个自定义类型来加密数据库中的密码,这样我就可以使用字符串属性来表示密码,但是 NHibernate 在存储到数据库之前会转换/加密值。目前,我在配置文件中存储了一个盐值和一个加密密钥,但我真的更愿意使用密码哈希。但是,自定义 NHibernate 类型除了被告知要处理的属性值之外,对存储的对象一无所知,因此我无法生成一些随机盐并将其与对象一起存储在此自定义类型中的另一个属性中.
由于我不能单独存储盐,我想知道是否可以从密码本身导出盐,然后对两者的组合进行哈希处理。例如,我可能会取密码,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 对象、一个值和一个参数索引。我对参数本身或被持久化的对象类型一无所知。我只有一个值。我无法生成随机盐并将其存储在单独的属性中,因为我不知道要持久化的对象上存在哪些属性,也不知道它们在参数集合中存储的顺序。我的目标是在此方法调用的上下文中以最安全的方式对密码进行哈希处理。如果您要反对我的建议,那么在这种情况下接受一个替代想法会很有帮助。