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

标签 java javascript node.js salt pbkdf2

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

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/

相关文章:

java - 需要敌人管理器在生成敌人之间等待

java - 在 Netbeans 平台中创建类似 Empathy 聊天窗口的主视图

java - 如何使用 Java POI 从工作簿中删除所有公式

javascript - 每隔一段时间将项目从 JavaScript 数组中逐一输出到 HTML 文本

node.js - 测试 NodeJS 应用程序时,我应该将 Capybara.app 设置为什么?

java - 在 Java 8 中收集列表

javascript - 使用传单中的测量工具时禁用弹出窗口

javascript - 如何将 POST 表单数据转换为 JSON 对象

javascript - 为什么我无法在 Javascript Date 对象上使用 getDay() 方法和 getUTCDay() 方法获得相同的结果

javascript - 双向绑定(bind)似乎不起作用。列表不会自动更新