如何使用加密创建random-salt-hash

时间:2012-07-17 09:58:00

标签: javascript node.js cryptography node-crypto

我想使用node.js加密lib创建一个salt-hash,而不必解析任何硬编码数据。

硬编码是什么意思?

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;
}

1 个答案:

答案 0 :(得分:24)

快速查看文档会调出crypto.randomBytes函数。

var buf = crypto.randomBytes(16);

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