gpt4 book ai didi

java - 无法使用 SHA-256 和 salt 创建用于密码散列的 Java 方法的 Javascript 模拟

转载 作者:行者123 更新时间:2023-11-28 19:13:42 24 4
gpt4 key购买 nike

为了完成下一个目标,我已经奋斗了一段时间了:我有一个“重置密码”页面,该页面应该将新密码发送到服务器。我想用盐对其进行哈希处理,这样我最终可以将其保存在数据库中。在服务器端,我有以下创建密码哈希的方法:

public static String makeHash(String password, String salt) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes("UTF-8"));

byte byteData[] = md.digest(makeHash(salt.toLowerCase()));

return Base64.getEncoder().encodeToString(byteData);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
log.error("Unable to make hash for pass. No hashing.", e);
}

return password;
}

private static byte[] makeHash(String val) throws NoSuchAlgorithmException, UnsupportedEncodingException {
return MessageDigest.getInstance("SHA-256").digest(val.getBytes("UTF-8"));
}

我尝试了几个 Javascript 库 - crypto、crypto-js、SJCL,但无法创建与 Java 方法生成的密码相同的密码。例如,最后一次工作尝试是:

var crypto = require('crypto');
crypto.pbkdf2('123', 'test@gmail.com', 1000, 60, 'sha256', function(err, key) {
if (err)
throw err;
console.log(key.toString('Base64')); // 'c5e478d...1469e50'
});

它为我生成了这个哈希值 - Qr2lzotlRWj7BeJeFooMRj64auMPTb3PRhwLmfNcl4DCVAlFFibgOqZiyExZNO5i/icAUYoMjy73jSTd,而 Java 给了我 - /pyQf3JCj5XoczfsYJ4LUb+y0DONGMl/AFzLiBTo8LA= >。

我无法更改后端,因为它已经运行了一段时间,所以我希望有人可以帮助我解决这个问题。

最佳答案

双方必须使用相同的算法。在 Java 中,您仅使用 SHA-256,而在 Node 中,您使用 PBKDF2 和 SHA-256。

Node.js 的加密模块提供 createHash(algorithm)功能。您可以在其中直接指定 SHA-256。 PBKDF2 是一种仅在底层使用不同哈希函数的算法。

如果您想要哈希密码,那么使用具有大量迭代 (> 86,000) 的 PBKDF2 以及与密码哈希一起存储的随机盐会更安全。

Java 在其标准库中支持 PBKDF2。

如果您确实想直接使用 SHA-256 并且我强烈建议不要这样做,您可以使用以下代码:

var crypto = require('crypto');
var key = "123";
var salt = "test@gmail.com";

key = crypto.createHash('sha256')
.update(key, "utf8")
.update(makeHash(salt))
.digest("base64");

console.log(key);

function makeHash(val) {
return crypto.createHash('sha256').update(val, "utf8").digest();
}

输出:

/pyQf3JCj5XoczfsYJ4LUb+y0DONGMl/AFzLiBTo8LA=

请注意,Hash.digest() 采用可选的输出编码,而不是附加数据。

关于java - 无法使用 SHA-256 和 salt 创建用于密码散列的 Java 方法的 Javascript 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com