Node.js哈希字符串?

我有一个想要哈希的字符串。在node.js中生成哈希最简单的方法是什么?

散列用于版本控制,而不是安全性。

359469 次浏览

看看crypto.createHash(算法)

var filename = process.argv[2];
var crypto = require('crypto');
var fs = require('fs');


var md5sum = crypto.createHash('md5');


var s = fs.ReadStream(filename);
s.on('data', function(d) {
md5sum.update(d);
});


s.on('end', function() {
var d = md5sum.digest('hex');
console.log(d + '  ' + filename);
});

如果你只是想md5哈希一个简单的字符串,我发现这对我有用。

var crypto = require('crypto');
var name = 'braitsch';
var hash = crypto.createHash('md5').update(name).digest('hex');
console.log(hash); // 9b74c9897bac770ffc029102a200c5de

节点的加密模块API仍然不稳定。

从4.0.0版本开始,本地Crypto模块不再不稳定。从官方文档:

加密

稳定性:2 -稳定

API已被证明是令人满意的。与npm生态系统的兼容性 是高优先级,除非绝对必要,否则不会被破坏。

因此,应该认为使用本机实现是安全的,没有外部依赖。

作为参考,下面提到的模块是在Crypto模块仍然不稳定时作为替代解决方案提出的。


你也可以使用模块sha1md5中的一个,它们都可以完成这项工作。

$ npm install sha1

然后

var sha1 = require('sha1');


var hash = sha1("my message");


console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

$ npm install md5

然后

var md5 = require('md5');


var hash = md5("my message");


console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5是不安全的,但经常被Gravatar等服务使用。)

这些模块的API不会改变!

在这里,您可以在您的硬件上对所有受支持的哈希值进行基准测试,这些哈希值由您的node.js版本所支持。有些是加密的,有些只是用于校验和。每个算法计算“Hello World”100万次。每个算法可能需要大约1-15秒(在标准谷歌计算引擎上使用Node.js 4.2.2测试)。

for(var i1=0;i1<crypto.getHashes().length;i1++){
var Algh=crypto.getHashes()[i1];
console.time(Algh);
for(var i2=0;i2<1000000;i2++){
crypto.createHash(Algh).update("Hello World").digest("hex");
}
console.timeEnd(Algh);
}
< p >结果:< br > DSA: 1992 ms < br > DSA-SHA: 1960 ms < br > DSA-SHA1: 2062 ms < br > DSA-SHA1-old: 2124 ms < br > RSA-MD4: 1893 ms < br > RSA-MD5: 1982 ms < br > RSA-MDC2: 2797 ms < br > RSA-RIPEMD160: 2101 ms < br > RSA-SHA: 1948 ms < br > RSA-SHA1: 1908 ms < br > RSA-SHA1-2: 2042 ms < br > RSA-SHA224: 2176 ms < br > RSA-SHA256: 2158 ms < br > RSA-SHA384: 2290 ms < br > RSA-SHA512: 2357 ms < br > dsaEncryption: 1936 ms < br > dsaWithSHA: 1910 ms < br > dsaWithSHA1: 1926 ms < br > dss1: 1928 ms < br > ecdsa-with-SHA1: 1880 ms < br > md4: 1833 ms < br > md4WithRSAEncryption: 1925 ms < br > md5: 1863 ms < br > md5WithRSAEncryption: 1923 ms < br > mdc2: 2729 ms < br > mdc2WithRSA: 2890 ms < br > ripemd: 2101 ms < br > ripemd160: 2153 ms < br > ripemd160WithRSA: 2210 ms < br > rmd160: 2146 ms < br > 沙:1929 ms < br > sha1: 1880 ms < br > sha1WithRSAEncryption: 1957 ms < br > sha224: 2121 ms < br > sha224WithRSAEncryption: 2290 ms < br > sha256: 2134 ms < br > sha256WithRSAEncryption: 2190 ms < br > sha384: 2181 ms < br > sha384WithRSAEncryption: 2343 ms < br > sha512: 2371 ms < br > sha512WithRSAEncryption: 2434 ms < br > shaWithRSAEncryption: 1966 ms < br > ssl2-md5: 1853 ms < br > ssl3-md5: 1868 ms < br > ssl3-sha1: 1971 ms < br > 惠而浦:2578 ms < br > < / p >

考虑从 http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (简而言之:首先加密,然后验证。之后先验证,然后解密) 我已经在node.js中实现了以下解决方案:

function encrypt(text,password){
var cipher = crypto.createCipher(algorithm,password)
var crypted = cipher.update(text,'utf8','hex')
crypted += cipher.final('hex');
return crypted;
}


function decrypt(text,password){
var decipher = crypto.createDecipher(algorithm,password)
var dec = decipher.update(text,'hex','utf8')
dec += decipher.final('utf8');
return dec;
}


function hashText(text){
var hash = crypto.createHash('md5').update(text).digest("hex");
//console.log(hash);
return hash;
}


function encryptThenAuthenticate(plainText,pw)
{
var encryptedText = encrypt(plainText,pw);
var hash = hashText(encryptedText);
return encryptedText+"$"+hash;
}
function VerifyThenDecrypt(encryptedAndAuthenticatedText,pw)
{
var encryptedAndHashArray = encryptedAndAuthenticatedText.split("$");
var encrypted = encryptedAndHashArray[0];
var hash = encryptedAndHashArray[1];
var hash2Compare = hashText(encrypted);
if (hash === hash2Compare)
{
return decrypt(encrypted,pw);
}
}

它可以用以下方法进行测试:

var doom = encryptThenAuthenticate("The encrypted text",user.cryptoPassword);
console.log(VerifyThenDecrypt(doom,user.cryptoPassword));

希望这对你有所帮助:-)

sha256("string or binary");

我在其他答案上遇到了问题。我建议你将encoding参数设置为binary以使用字节字符串,并防止Javascript (NodeJS)和其他语言/服务之间的不同哈希,如Python, PHP, Github…

如果你不使用这段代码,你可以在NodeJS和Python之间得到不同的散列…

如何获得相同的散列,Python, PHP, Perl, Github(并防止一个问题):

NodeJS正在哈希字符串的UTF-8表示。其他语言(如Python、PHP或PERL…)是对字节字符串进行哈希。

我们可以添加二进制参数来使用字节字符串。

代码:

const crypto = require("crypto");


function sha256(data) {
return crypto.createHash("sha256").update(data, "binary").digest("base64");
//                                               ------  binary: hash the byte string
}


sha256("string or binary");

文档:

  • 加密。createHash(算法[选项]):该算法依赖于平台上OpenSSL版本支持的可用算法。
  • hash.digest((编码)):编码可以是'hex', 'latin1'或'base64'。(64进制更短)。

你可以用sha256("\xac"), &;\xd1", &;\xb9", &;\xe2", &;\xbb", &;\x93"等来解决这个问题…

  • 其他语言(如PHP, Python, Perl…)和我的解决方案.update(data, "binary"):

      sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
    
  • Nodejs默认(不带二进制):

      sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
    

我使用blueimp-md5,它是“兼容服务器端环境,如Node.js,模块加载器,如RequireJS, Browserify或webpack和所有的web浏览器。”

像这样使用它:

var md5 = require("blueimp-md5");


var myHashedString = createHash('GreensterRox');


createHash(myString){
return md5(myString);
}

如果在公开场合传递散列值,对它们加盐总是一个好主意,这样人们就更难重新创建它们:

createHash(myString){
var salt = 'HnasBzbxH9';
return md5(myString+salt);
}

crypto模块使得这非常简单。

设置:

// import crypto from 'crypto';
const crypto = require('crypto');


const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');

用法:

sha256('Hello, world. ');

即使哈希不是为了安全性,您也可以使用sha而不是md5。在我看来,人们现在应该忘记md5,它是过去的事了!

不建议使用普通的nodejs sha256。所以,现在你有两个选择:

var shajs = require('sha.js')  - https://www.npmjs.com/package/sha.js (used by Browserify)


var hash = require('hash.js')  - https://github.com/indutny/hash.js

我更喜欢使用shajs而不是hash,因为我认为sha是目前最好的哈希函数,你现在不需要一个不同的哈希函数。所以要在十六进制中获得一些哈希,你应该像下面这样做:

sha256.update('hello').digest('hex')

简单的一句话:

如果你想要UTF8文本哈希:

const hash = require('crypto').createHash('sha256').update('Hash me', 'utf8').digest('hex');

如果你想用Python, PHP, Perl, Github得到相同的散列:

const hash = require('crypto').createHash('sha256').update('Hash me', 'binary').digest('hex');

你也可以用'sha1''md5''sha256''sha512'替换'sha256'

function md5(a) {
var r = 0,
c = "";
return h(a);


function h(t) {
return u(l(m(t)))
}


function l(t) {
return p(g(f(t), 8 * t.length))
}


function u(t) {
for (var e, i = r ? "0123456789ABCDEF" : "0123456789abcdef", n = "", o = 0; o < t.length; o++)
e = t.charCodeAt(o),
n += i.charAt(e >>> 4 & 15) + i.charAt(15 & e);
return n
}


function m(t) {
for (var e, i, n = "", o = -1; ++o < t.length;)
e = t.charCodeAt(o),
i = o + 1 < t.length ? t.charCodeAt(o + 1) : 0,
55296 <= e && e <= 56319 && 56320 <= i && i <= 57343 && (e = 65536 + ((1023 & e) << 10) + (1023 & i),
o++),
e <= 127 ? n += String.fromCharCode(e) : e <= 2047 ? n += String.fromCharCode(192 | e >>> 6 & 31, 128 | 63 & e) : e <= 65535 ? n += String.fromCharCode(224 | e >>> 12 & 15, 128 | e >>> 6 & 63, 128 | 63 & e) : e <= 2097151 && (n += String.fromCharCode(240 | e >>> 18 & 7, 128 | e >>> 12 & 63, 128 | e >>> 6 & 63, 128 | 63 & e));
return n
}


function f(t) {
for (var e = Array(t.length >> 2), i = 0; i < e.length; i++)
e[i] = 0;
for (i = 0; i < 8 * t.length; i += 8)
e[i >> 5] |= (255 & t.charCodeAt(i / 8)) << i % 32;
return e
}


function p(t) {
for (var e = "", i = 0; i < 32 * t.length; i += 8)
e += String.fromCharCode(t[i >> 5] >>> i % 32 & 255);
return e
}


function g(t, e) {
t[e >> 5] |= 128 << e % 32,
t[14 + (e + 64 >>> 9 << 4)] = e;
for (var i = 1732584193, n = -271733879, o = -1732584194, s = 271733878, a = 0; a < t.length; a += 16) {
var r = i,
c = n,
h = o,
l = s;
n = E(n = E(n = E(n = E(n = N(n = N(n = N(n = N(n = C(n = C(n = C(n = C(n = S(n = S(n = S(n = S(n, o = S(o, s = S(s, i = S(i, n, o, s, t[a + 0], 7, -680876936), n, o, t[a + 1], 12, -389564586), i, n, t[a + 2], 17, 606105819), s, i, t[a + 3], 22, -1044525330), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 4], 7, -176418897), n, o, t[a + 5], 12, 1200080426), i, n, t[a + 6], 17, -1473231341), s, i, t[a + 7], 22, -45705983), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 8], 7, 1770035416), n, o, t[a + 9], 12, -1958414417), i, n, t[a + 10], 17, -42063), s, i, t[a + 11], 22, -1990404162), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 12], 7, 1804603682), n, o, t[a + 13], 12, -40341101), i, n, t[a + 14], 17, -1502002290), s, i, t[a + 15], 22, 1236535329), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 1], 5, -165796510), n, o, t[a + 6], 9, -1069501632), i, n, t[a + 11], 14, 643717713), s, i, t[a + 0], 20, -373897302), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 5], 5, -701558691), n, o, t[a + 10], 9, 38016083), i, n, t[a + 15], 14, -660478335), s, i, t[a + 4], 20, -405537848), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 9], 5, 568446438), n, o, t[a + 14], 9, -1019803690), i, n, t[a + 3], 14, -187363961), s, i, t[a + 8], 20, 1163531501), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 13], 5, -1444681467), n, o, t[a + 2], 9, -51403784), i, n, t[a + 7], 14, 1735328473), s, i, t[a + 12], 20, -1926607734), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 5], 4, -378558), n, o, t[a + 8], 11, -2022574463), i, n, t[a + 11], 16, 1839030562), s, i, t[a + 14], 23, -35309556), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 1], 4, -1530992060), n, o, t[a + 4], 11, 1272893353), i, n, t[a + 7], 16, -155497632), s, i, t[a + 10], 23, -1094730640), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 13], 4, 681279174), n, o, t[a + 0], 11, -358537222), i, n, t[a + 3], 16, -722521979), s, i, t[a + 6], 23, 76029189), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 9], 4, -640364487), n, o, t[a + 12], 11, -421815835), i, n, t[a + 15], 16, 530742520), s, i, t[a + 2], 23, -995338651), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 0], 6, -198630844), n, o, t[a + 7], 10, 1126891415), i, n, t[a + 14], 15, -1416354905), s, i, t[a + 5], 21, -57434055), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 12], 6, 1700485571), n, o, t[a + 3], 10, -1894986606), i, n, t[a + 10], 15, -1051523), s, i, t[a + 1], 21, -2054922799), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 8], 6, 1873313359), n, o, t[a + 15], 10, -30611744), i, n, t[a + 6], 15, -1560198380), s, i, t[a + 13], 21, 1309151649), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 4], 6, -145523070), n, o, t[a + 11], 10, -1120210379), i, n, t[a + 2], 15, 718787259), s, i, t[a + 9], 21, -343485551),
i = v(i, r),
n = v(n, c),
o = v(o, h),
s = v(s, l)
}
return [i, n, o, s]
}


function _(t, e, i, n, o, s) {
return v((a = v(v(e, t), v(n, s))) << (r = o) | a >>> 32 - r, i);
var a, r
}


function S(t, e, i, n, o, s, a) {
return _(e & i | ~e & n, t, e, o, s, a)
}


function C(t, e, i, n, o, s, a) {
return _(e & n | i & ~n, t, e, o, s, a)
}


function N(t, e, i, n, o, s, a) {
return _(e ^ i ^ n, t, e, o, s, a)
}


function E(t, e, i, n, o, s, a) {
return _(i ^ (e | ~n), t, e, o, s, a)
}


function v(t, e) {
var i = (65535 & t) + (65535 & e);
return (t >> 16) + (e >> 16) + (i >> 16) << 16 | 65535 & i
}
}
string = 'hello';
console.log(md5(string));

你可以使用crypto-js javaScript库的加密标准,有最简单的方法生成sha256sha512

const SHA256 = require("crypto-js/sha256");
const SHA512 = require("crypto-js/sha512");


let password = "hello"
let hash_256 = SHA256 (password).toString();
let hash_512 = SHA512 (password).toString();


我不得不把我的2美分扔在希望这能帮助某人。

对于那些使用CommonJS的人

const crypto = require('crypto');
const secret = 'I love writing code, fixing things and building helpful tools';
const hash = crypto.createHmac('sha256', secret).digest('hex');


console.log('Hash successfully generated: ', hash);

适用于使用ES模块的用户

const { createHmac } = await import('crypto');
const secret = 'I love writing code, fixing things and building helpful tools';
const hash = createHmac('sha256', secret).digest('hex');


console.log('Hash successfully generated: ', hash);
< p >超级简单! 快乐编码:)

使用PBKDF2在NodeJs中进行密码哈希

const pbkdf2 = require("pbkdf2");
const crypto = require("crypto");


// UserSchema
//...


// Method to create pbkdf2 hash from plain text
UserSchema.methods.createHash = async function (plainTextPassword) {


// Generate a salt and then create hash
const salt = crypto.randomBytes(16).toString("hex");
const hashedPassword = pbkdf2
.pbkdf2Sync(plainTextPassword, salt, 10, 32, "sha512")
.toString("hex");


// Saving both the dynamic salt and hash in the Database
return [salt, hashedPassword].join("#");
};


// Validating the password with pbkdf2 hash
UserSchema.methods.validatePassword = async function (candidatePassword) {
const hashedPassword = this.password_hash.split("#")[1];
const salt = this.password_hash.split("#")[0];


const hash = pbkdf2
.pbkdf2Sync(candidatePassword, salt, 10, 32, "sha512")
.toString("hex");


if (hash === hashedPassword) {
return true;
}
return false;
};


module.exports.User = mongoose.model("User", UserSchema);

使用Argon2在NodeJs中进行密码哈希

const argon2 = require("argon2");


// UserSchema
...


// Method to generate Hash from plain text  using argon2
UserSchema.methods.createHash = async function (plainTextPassword) {
// return password hash
return await argon2.hash(plainTextPassword);
};


// Method to validate the entered password using argon2
UserSchema.methods.validatePassword = async function (candidatePassword) {
return await argon2.verify(this.password_hash, candidatePassword)
};


module.exports.User = mongoose.model("User", UserSchema);
这篇文章可以帮助设置执行演示项目。 https://mojoauth.com/blog/hashing-passwords-in-nodejs/ < / p >