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

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


当前回答

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

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

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

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

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


您还可以使用sha1或md5模块中的一个,它们都可以完成这项工作。

$ npm install sha1

然后

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

or

$ npm install md5

然后

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

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

这些模块的API不会改变!

其他回答

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

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

看看crypto。createhash (algorithm)

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);
});
sha256("string or 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(algorithm[, options]):该算法依赖于平台上OpenSSL版本支持的可用算法。 hash.digest([encoding]):编码可以是'hex', 'latin1'或'base64'。(64进制更短)。

你可以把问题:sha256(“\ xac”),“\ xd1”、“\ xb9”,“\ xe2”、“\ xbb”,“\ x93”等……

其他语言(如PHP, Python, Perl…)和我用.update(data, "binary")的解决方案: sha1(“\ xac”)/ / 39527 c59247a39d18ad48b9947ea738396a3bc47 默认情况下(不含二进制文件): sha1 / / f50eb35d94f1d75480496e54f4b4a472a9148752(“\ xac”)

使用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/

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

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();