是否可以从密码派生盐,然后哈希密码+派生盐?

Chr*_*ris 4 encryption nhibernate

我使用NHibernate并有一个自定义类型来加密数据库中的密码,这样我就可以使用字符串属性来表示密码,但是NHibernate在存储到db之前转换/加密该值.目前,我在配置文件中存储了salt值和加密密钥,但我真的更愿意转移到密码哈希.但是,自定义NHibernate类型对被存储的对象一无所知,除了它被告知要处理的属性的值,因此我无法生成一些随机盐并将其与该对象一起存储在此自定义类型中的另一个属性中.

由于我不能单独存储盐,我想知道从密码本身导出盐是否可行,然后散列两者的组合.例如,我可能会使用密码,MD5哈希,然后使用MD5哈希作为salt.这样可以吗?这将允许我以确定的方式持久保存密码,同时使用每个密码的唯一(但派生)盐值,但是这样做时是否有任何安全考虑因素?

编辑:

因为到目前为止我收到的所有答案都未能解释问题的上下文,所以让我提出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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是NHibernate给我的全部.我收到IDbCommand对象,值和参数索引.我对参数本身或持久化对象的类型一无所知.我只有一个价值.我无法生成随机盐并将其存储在单独的属性中,因为我不知道要保留的对象上存在哪些属性,也不知道它们存储在参数集合中的顺序.我的目标是在此方法调用的上下文中以最安全的方式散列密码.如果你打算反对我的建议,那么在这种背景下接受另一种想法会很有帮助.

das*_*h1e 5

没有!如果从密码中导出salt,则所有相同的密码都具有相同的哈希,并且盐变得无用.

试试吧

var temp = value.ToString();
var salt = generateRandonSalt();
var encrypted = encryptor.Encrypt(temp + salt);
param.Value = salt + encrypted;
Run Code Online (Sandbox Code Playgroud)

使用"+"我的意思是连接操作数或与您的值兼容的东西.当然,您需要始终知道盐的长度,以便下次检查密码.

  • 不,每次哈希并存储密码时,都必须随机生成盐. (2认同)
  • 我写了一个例子,你可以在hash之后连接salt,一般我这样做.salt的原因是对于相同的密码,db具有不同的值. (2认同)