java - 如何将 Java 中的 Sha-512 哈希转换为其等效的 Node.js

标签 java node.js cryptojs

我在 Java 中有一个简单的哈希函数,我用 Node.js 重写了它,但它们产生了不同的结果。

这是Java:

public static String get_SHA_512_SecurePassword(String str, String customerId) {
    try {
        MessageDigest instance = MessageDigest.getInstance("SHA-512");
        instance.update(customerId.getBytes(StandardCharsets.UTF_8));
        byte[] digest = instance.digest(str.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(Integer.toString((b & 255) + 256, 16).substring(1));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
}

这是我生成的 Node.js 等效项。

let crypto = require('crypto');

function get_SHA_512_SecurePassword(str, customerId) {
    let hash = crypto.createHash('sha512')
    hash.update(customerId, 'utf8')
    let value = hash.digest(str, 'uft8')
    console.log(value.toString('hex'))
    return value.toString('hex');
}

任何人都可以解释我做错了什么或者如果我正确复制它们为什么不同?

最佳答案

你已经很接近了,问题是 .digest函数在 Node.js 中不带参数,所以我们调用 .update两次,一次使用 customerId,然后使用 str。我们实际上不需要将字符串编码传递给 .update 函数,因为 utf8 是默认编码。

const crypto = require('crypto');

function get_SHA_512_SecurePassword(str, customerId) {
    const hash = crypto.createHash('sha512');
    const digest = hash.update(customerId, "utf-8").update(str, "utf-8").digest();
    return digest.toString("hex");
}

console.log(get_SHA_512_SecurePassword("hello", "world"));

这个 Node.js 示例输出:

3e64afa1cb7d643aa36f63b8d092ad76b1f04ff557abbb3d05f5b9037abf68a6606a8885d51bec8f6f39ee7d0badd504241c3704e777a51c21a9723e285fb9b8

这应该与 Java 代码的输出相同。

关于java - 如何将 Java 中的 Sha-512 哈希转换为其等效的 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66651609/

相关文章:

node.js - 如何使用 cryptoJS 或 Node 的默认加密为 AES 选择密码?

java - JPA ConstraintViolationException 外键值为 null

java - 文本处理作业

java - 如何使用 AND 运算符使用两个或多个条件过滤 Netbeans Profiler 中的方法

node.js - 从nodejs中的stdin读取强制将\r\n转换为\n

encryption - cryptojs:如何生成 AES 密码

java - 基于java的soap请求总是返回soap响应,其中0作为我需要的值

python - Node.js 的 python 子脚本在完成时输出,不是实时的

c - 如何跟踪 C Linux 中 system() 运行的后台进程?

javascript - 使用 CryptoJS 解密 AES CFB 时有效字节数错误