2014-06-06 38 views
2

刚刚按照关于如何在数据库中存储密码的教程。他们使用以下方法来生成散列密码:Node.JS Crypto.HMac代码的生成

hasher.computeHash = function(source, salt) { 
    var hmac = crypto.crypto.createHmac("sha1", salt); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

对于什么都原因,我越来越糊涂当过我特地到密码加密我一直使用的秘密,我附在盐,但我可以” t找到任何资源,这样做这...我的意思是:

hasher.computeHash = function(source, salt) { 
    var saltNHash = salt + "super Secret LOOONG string!!"; 
    var hmac = crypto.crypto.createHmac("sha1", saltNHash); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

这是一个坏的方法? 有没有更好的方法在节点模块内进行加密(将密码存储在数据库中)?

谢谢,如果重复,很抱歉,我环顾四周,但我不认为我知道正确的关键字谷歌。

回答

3

我严重推荐使用Todd Yandell's answer并使用bcrypt。缓慢的算法是真的你想要的密码。这就是说,让我也解决你的问题。

让我们来谈谈我们为什么使用盐。盐是一种方式

  1. 减慢bruteforce企图。
    如果您不使用salt,则会同时暴露具有相同密码的两个用户。对每个散列分别提供所有内容,强制攻击者将散列尝试次数提高N级。
  2. 防止预计算攻击,例如rainbow tables。这些攻击使用相关散列的属性,并在计算时间和存储空间之间进行权衡,使无攻击的攻击算法(请参阅Windows XP)变得快速而轻松。

既然(我想!)你对每个密码都使用随机盐,你已经到了那里。

也就是说,你给所有东西附加秘密的方法确实没有那么有用。虽然它在技术上增加了一点复杂性;因为它只是一个静态字符串,所以它比没有默认的安全性好。一旦发现一次奇异秘密(如果数据库中甚至有一两个弱密码或者攻击者可以访问您的机器,则相当简单),它就不再有用。坚持你的随机盐,你会(可能)会罚款。