我如何将 Java 中的 Sha-512 哈希值转换为它的 Node.js 等价物

How can I convert Sha-512 hash in Java to its Node.js equivalent

我在 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 function does not take an argument in Node.js, so we'll call .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 代码的输出相同。

你的问题是你在node.js中使用了错误的密码。 java 中的 digest() 方法与 node.js

中的 crypto 方法略有不同

Java MessageDigest Api Doc

digest(byte[] input) Performs a final update on the digest using the specified array of bytes, then completes the digest computation.

因此,在 java 中,您在摘要中提供了另一个字符串并使用它来生成新的哈希,然后生成输出

在 node.js 但是 hmac.digest() 的文档指出 Crypto Doc

hmac.digest([encoding])

Calculates the HMAC digest of all of the data passed using hmac.update(). If encoding is provided a string is returned; otherwise a Buffer is returned;

因此它不会像您在该函数中传递 str 那样接受另一个要编码的字符串。它只接受一种编码。

所以在你的代码中

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

以下是正确的

  function get_SHA_512_SecurePassword(str, customerId) {
        let hash = crypto.createHash('sha512')

        hash.update(customerId, 'utf8')
        hash.update(str, 'utf8')
        let value = hash.digest('hex')

        console.log(value)
        return value;
    }