21

ハードコードされたデータを解析せずに、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;
}
4

1 に答える 1

41

ドキュメントをざっと見ると、crypto.randomBytes機能がわかります。

var buf = crypto.randomBytes(16);

これは、生のバイトを含むバッファを返します。文字列が必要な場合は、toString('base64')またはを使用できますtoString('hex')

于 2012-07-17T11:21:25.857 に答える