密码哈希与JavascriptNodejs

时间:2015-08-17 18:19:12

标签: javascript node.js password-protection

我的密码保护经验几乎不存在。我没有在大学里参加任何加密课程,我的数学课程只是简单地涉及实际的加密算法。现在,我想将用户密码存储在数据库中,以创建一个登录我的应用程序的安全方法。阅读this后,我收集了一些内容:

  • 密码哈希应该花费大量时间,以防止重复登录尝试并提高安全性。
  • 两个或多个密码可能哈希到同一个字符串。

考虑到这一点,我尝试使用jssha在我的节点服务器上实现密码哈希。复制自述文件中的示例:

var jsSHA = require('jssha');
var sha = new jsSHA("SHA-512", "TEXT");
sha.update("password");
var hash = sha.getHash("HEX");

console.log(hash);

我可以为密码字符串创建哈希值,但是这个模块似乎违反了上述两个要点。连续5次运行脚本每次都会创建相同的字符串,甚至使用构造函数中的可选hashmap来添加迭代:

var sha = new jsSHA("SHA-512", "TEXT", '{"numRounds" : 4000000}');

哈希以微秒完成,无论我向构造函数提供的轮数如何。

我无法在Javascript / Node中找到任何哈希文档。我不正确地使用模块,还是应该使用其他东西?

1 个答案:

答案 0 :(得分:0)

Node有一个内置模块,用于基于散列的键扩展:crypto.pbkdf2

我使用以下函数创建哈希:

function createHash(password, salt, iterations, hashLength, callback) {
    if(hashLength % 2 !== 0){
        throw new Error("hashLength must be even, because it returns a string of two-character hexadecimal digits.");
    }
    var keyLength = hashLength / 2;
    iterations = iterations || 10000;
    crypto.pbkdf2(password, salt, iterations, keyLength, function(err, bytes){
        var hash = Buffer(bytes, 'binary').toString('hex');
        callback(err, hash);
    });
}

...其中password是要转换为哈希的文字文本,salt是随密码一起存储的随机字符串,iterations是次要的重复密钥拉伸算法,keyLength是十六进制哈希字符串应该结束的时间长度,callback将哈希值返回给调用代码。

我将迭代和密钥长度存储在具有散列和盐的相同数据库行中而不是配置中,因此我可以选择在用户更新其密码时加强加密。

加密模块还包括一个盐创建方法crypto.randomBytes,我这样使用:

function createSalt(saltLength, callback){
    if(saltLength % 2 !== 0){
        throw new Error("saltLength must be even, because it returns a string of two-character hexadecimal digits.");
    }
    var byteLength = saltLength / 2;
    crypto.randomBytes(byteLength, function(err, bytes){
        var salt = Buffer(bytes, 'binary').toString('hex');
        callback(err, salt);
    });
}

免责声明:我也不是密码学家。 :)