我想创建一个哈希I love cupcakes(用密钥签名abcdeg)
如何使用Node.js加密创建该哈希?
我必须生成两个密钥(私有和公共)来加密公共文本,并让拥有私钥的用户解密文本.
有可能使用Crypto模块吗?
我试图找出如何使用crypto模块在nodejs中加密和散列密码.我可以创建哈希密码来做到这一点:
UserSchema.pre('save', function(next) {
var user = this;
var salt = crypto.randomBytes(128).toString('base64');
crypto.pbkdf2(user.password, salt, 10000, 512, function(err, derivedKey) {
user.password = derivedKey;
next();
});
});
Run Code Online (Sandbox Code Playgroud)
但是我对如何验证密码感到困惑.
UserSchema.methods.validPassword = function(password) {
// need to salt and hash this password I think to compare
// how to I get the salt?
}
Run Code Online (Sandbox Code Playgroud) 我试图在NodeJS中散列变量,如下所示:
var crypto = require('crypto');
var hash = crypto.createHash('sha256');
var code = 'bacon';
code = hash.update(code);
code = hash.digest(code);
console.log(code);
Run Code Online (Sandbox Code Playgroud)
但看起来我误解了文档作为console.log没有记录一个哈希版本的培根,而只是一些关于SlowBuffer的信息.
这样做的正确方法是什么?
我在我的应用程序中使用加密模块.似乎在nodejs http://nodejs.org/api/crypto.html中分布了加密模块, 所以我需要做npm install crypto吗?有什么区别来自https://npmjs.org/package/crypto和nodejs api加密模块?
问题
我有node.js模块crypto.createHash用于生成md5哈希.
最近我注意到crypto模块生成的哈希在新版本中有所不同:
码
require('crypto').createHash('md5').update('¥').digest('hex')
Run Code Online (Sandbox Code Playgroud)
Node.js v0.10.0
输出: ab3af8566ddd20d7efc9b314abe90755
Node.js v6.1.0
输出: 07625e142e4ac5961de57472657a88c1
题
我想知道新版本的原因是什么,我该如何解决?
更新
关于GitHub的类似问题:
当我尝试加密的文本具有重音字符(例如ä,ï,ë)时,我遇到了在NodeJS中生成正确签名(使用crypto.js)的问题
generateSignature = function (str, secKey) {
var hmac = crypto.createHmac('sha1', secKey);
var sig = hmac.update(str).digest('hex');
return sig;
};
Run Code Online (Sandbox Code Playgroud)
如果'str'不包含重音字符(如ä,ï,ë等字符),则此函数将返回正确的HMAC签名.如果文本中存在重音字符,则不会返回正确的HMAC.重音字符在UTF8编码中有效,所以我不知道为什么加密有问题.可能是我需要以某种方式告诉加密我正在签署utf8编码文本,但我不知道如何做到这一点.
这篇文章中描述了完全相同的问题:带有重音的NodeJS hmac摘要问题 然而,帖子本身以及答案对我来说没有意义(因为他们传递他们想要加密的数据,秘密密钥应该在哪里走).
以下是str和secKey的硬编码值的代码版本:
var crypto = require('crypto');
str="äïë";
secKey="secret";
var hmac = crypto.createHmac('sha1', secKey);
var sig = hmac.update(new Buffer(str, 'utf8')).digest('hex');
console.log("Sig: " + sig);
console.log("Expected: 094b2ba039775bbf970a58e4a0a61b248953d30b");
// "Expected" was generated using http://hash.online-convert.com/sha1-generator
Run Code Online (Sandbox Code Playgroud)
输出::
西格:39c9f1a6094c76534157739681456e7878557f58
预计:094b2ba039775bbf970a58e4a0a61b248953d30b
谢谢
有没有一种很好的方法来使用公钥验证Node.JS(v0.4 +)中的签名?
当前的加密模块允许使用证书但不允许使用公钥.例如:
var crypto = require("crypto");
verifier = crypto.createVerifier("sha1");
verifier.update("signed data");
verifier.verify(CERT, signature);
Run Code Online (Sandbox Code Playgroud)
变量CERT需要签名证书(我猜公钥是从中提取的)但我所拥有的只是公钥而不是证书.
只有实现这一点的可靠方法似乎是将数据,公钥和签名的内容转储到文件中并执行 openssl dgst
fs.writeFileSync("public.key", pubkey);
fs.writeFileSync("sig.sha1", signature);
fs.writeFileSync("data.txt", data);
exec("openssl dgst -sha1 -verify public.key -signature sig.sha1 data.txt", ...)
Run Code Online (Sandbox Code Playgroud)
但是每次我需要验证签名时创建(和删除)文件似乎是完全浪费.
任何好的想法如何做得更好?
更新2011-08-03
Node.js v0.5中的加密模块允许使用证书和公钥 (RSA或X.509)进行验证
我在使用Node的加密库时遇到了奇怪的问题.我写了这个简单的AES测试脚本:
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8')
var text = "123|123123123123123";
cipher.update(text,'utf8','hex')
var crypted = cipher.final('hex')
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8')
decipher.update(crypted,'hex','utf8')
var dec = decipher.final('utf8')
Run Code Online (Sandbox Code Playgroud)
当我执行console.log(dec)时,它为null.出于某种原因,如果我将测试设置为"123 | 123123",它可以工作.那么为什么"123 | 123123"工作但"123 | 123123123123123"不工作?
我想使用node.js crypto lib创建一个salt-hash,而不必解析任何硬编码数据.
硬编码我的意思是什么?
var salt, hardcodedString = "8397dhdjhjh";
crypto.createHmac('sha512', hardcodedString).update(salt).digest("base64");
Run Code Online (Sandbox Code Playgroud)
如果不使用原始javascript,随机函数或硬编码,我怎么能创建一个随机字符串?
问候
UPDATE
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 …Run Code Online (Sandbox Code Playgroud) node-crypto ×10
node.js ×10
javascript ×3
cryptography ×2
hash ×2
aes ×1
algorithm ×1
encryption ×1
hmac ×1
npm ×1
openssl ×1
utf-8 ×1