我正确地哈希密码?

我目前的项目是我的第一个Node.js(如果重要的话也使用MongoDB,Mongoose和Express),并且容易分心,我决定如何处理用户authentication的时候,已经落在了encryption的兔子洞里。 (这个项目不需要其他encryption)。

遵循这个页面上的模式(pattern,不是代码 – 我在安装node.bcrypt时遇到了问题,但是没有与node-Na一起使用), 而且这个页面我的过程是

  1. 新用户通过https提交密码

  2. 该模式会生成一个盐

  3. 模式散列密码和salt的串联

  4. schema将盐和密码与用户信息一起存储

现在我不知道这是我个人的缺陷,但是我在遵循libsodium文档的时候遇到了麻烦。 节点钠不提供散列的任何附加信息(虽然它有一个encryption的例子)。

这是我想用来生成哈希的代码:

let buf = new Buffer(sodium.crypto_pwhash_STRBYTES); sodium.randombytes_buf(buf, sodium.crypto_pwhash_STRBYTES); let salt = buf.toString(); let preBuffer = "somePass" + salt; let passwordBuf = Buffer.from(preBuffer); let hash = sodium.crypto_pwhash_str(passwordBuf, sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE, sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE); 

所以问题是两个部分。 这是一个好的过程,是适当的代码?

就我个人而言,我已经使用encryption ,我现在正在做的4个步骤(在检查几个条件7个字符通过,一个符号,一个数字…)。 我将使用encryption分享代码。

 var salt =rand(160, 36); var salted_pass = salt + password; var token = crypto.randomBytes(64).toString('hex'); // I even generate a token for my users var hashed_password = crypto.createHash('sha512').update(salted_pass).digest("hex"); 

编辑警告这不是一个完全安全的做法,因为它可能会变成可预测的。 请参阅下面的评论,解释为什么它不是一个好方法。

正是因为这个原因,我在过去使用过scrypt-for-humans软件包。

https://github.com/joepie91/scrypt-for-humans

Scrypt是一个非常安全的哈希库,这个更高层的包装让你很难把事情弄糟。 它也是专门devise用于安全地散列密码,所以这也是一个积极的:)