【问题标题】:How to create random-salt-hash with crypto如何使用加密创建随机盐哈希
【发布时间】:2012-07-17 09:58:00
【问题描述】:

我想使用 node.js 加密库创建盐哈希,而无需解析任何硬编码数据。

硬编码是什么意思?

var salt, hardcodedString = "8397dhdjhjh";
crypto.createHmac('sha512', hardcodedString).update(salt).digest("base64");

难道没有其他方法可以在不使用原始 javascript、随机函数或硬编码的情况下创建随机字符串吗?

问候

更新

var Crypto = require('crypto')
    , mongoose = require('mongoose');

module.exports = mongoose.model('User', new mongoose.Schema({
    username: {
        type: String
        , required: true
        , index: { unique: true, sparse: true }
        , set: toLower
    },
    email: {
        type: String
        , required: true
        , index: { unique: true, sparse: true }
        , set: toLower
    },
    salt: {
        type: String
        , set: generateSalt
    },
    password: {
        type: String
        , set: encodePassword
    }
}),'Users');

function toLower(string) {
    return string.toLowerCase();
}

function generateSalt() {
    //return Math.round((new Date().valueOf() * Math.random())) + '';
    Crypto.randomBytes('256', function(err, buf) {
        if (err) throw err;
        return buf;
    });
    // return Crypto.randomBytes('256'); // fails to
}

function encodePassword(password) {
    return password;
    // TODO: setter has no access to this.salt
    //return Crypto.createHmac('sha512', salt).update(password).digest("base64");
}

function authenticate(plainPassword) {
    return encodePassword(plainPassword) === this.password;
}

【问题讨论】:

  • 顺便说一句,普通 HMAC 不是安全密码哈希。 crypto.pbkdf2 > 50000 次迭代是一个不错的选择。
  • ^- 那叫'stretching' 给不知道的人。
  • 很好的链接。很高兴找到一篇包含有关该主题的大量信息并有很好解释的帖子。
  • 为什么要通过在处理器上施加实际负载来进行“拉伸”,而不是仅仅将响应延迟选择的时间量?
  • @MikaelGrön 目标是减缓在自己的计算机上(通常在 GPU 上)计算哈希的攻击者。它会减慢您自己的服务器速度是一个不幸的副作用。

标签: javascript node.js cryptography node-crypto


【解决方案1】:

快速浏览文档会发现crypto.randomBytes 函数。

var buf = crypto.randomBytes(16);

这将返回一个包含原始字节的缓冲区。如果需要字符串,可以使用toString('base64')toString('hex')

【讨论】:

  • 你为什么引用这个数字?并且 256 字节对于盐来说有点长,我帖子中的 256 只是示例中的引用。
  • 对不起,更改为返回 Crypto.randomBytes(256);.. mongodb 文档中仍然没有盐。我会检查这是否是猫鼬问题
  • 好的,只有当属性确实有值时,set 才会自动触发。我将设置:generateSalt 更改为默认值:generateSalt。这现在有效。但是有没有办法将你的盐编码为 hex 或 base64?
  • crypto.randomBytes(128).toString('base64');
猜你喜欢
  • 2010-10-06
  • 2011-12-06
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多