在NodeJS和Java中计算HMAC sha-512

在NodeJS和Java中计算HMAC sha-512,java,node.js,hmac,sha512,Java,Node.js,Hmac,Sha512,我正在尝试将sha-512计算从java迁移到节点JS,但似乎无法获得相同的结果 Java代码(从中看是标准的): 公共类测试 { 私有静态字符串get_SecurePassword(字符串passwordToHash、字符串salt、字符串algo)抛出NoSuchAlgorithmException { 字符串generatedPassword=null; MessageDigest md=MessageDigest.getInstance(algo); md.update(salt.get

我正在尝试将sha-512计算从java迁移到节点JS,但似乎无法获得相同的结果

Java代码(从中看是标准的):

公共类测试
{
私有静态字符串get_SecurePassword(字符串passwordToHash、字符串salt、字符串algo)抛出NoSuchAlgorithmException
{
字符串generatedPassword=null;
MessageDigest md=MessageDigest.getInstance(algo);
md.update(salt.getBytes());
byte[]bytes=md.digest(passwordToHash.getBytes());
StringBuilder sb=新的StringBuilder();
for(int i=0;i
输出:

125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
NodeJS:

const crypto=require('crypto');
函数getSecurePassword(密码、salt、algo){
常量ALGOFORMATED=algo.toLowerCase().replace('-','');
const hash=crypto.createHmac(algoFormatted,salt);
hash.update(密码);
const res=hash.digest('hex');
返回res;
}
log(getSecurePassword('test','test','SHA-512');
输出:

125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
我做错了什么


注意:我正在使用Java 8和节点10.13

在节点中,您使用的是HMAC-SHA-512,但在Java中,您只使用SHA-512并连接键和明文。这不是HMAC的工作方式。您还需要在Java中使用HMAC-SHA-512:

import static java.nio.charset.StandardCharsets.*;

import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class Test {
    private static String getSecurePassword(String password, String salt, String algo)
            throws NoSuchAlgorithmException, InvalidKeyException {
        SecretKeySpec secretKeySpec = new SecretKeySpec(salt.getBytes(UTF_8), algo);
        Mac mac = Mac.getInstance(algo);
        mac.init(secretKeySpec);
        byte[] bytes = mac.doFinal(password.getBytes(UTF_8));

        return new BigInteger(1, bytes).toString(16);
    }

    public static void main(String[] args)
            throws NoSuchAlgorithmException, InvalidKeyException {
        System.out.println(getSecurePassword("test", "test", "HmacSHA512"));
    }
}
输出:

125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc

如果有人正在寻找我通过@DavidConrad制作的节点JS修复程序,那么它就是:

const crypto=require('crypto');
函数getSecurePassword(密码、salt、algo){
常量ALGOFORMATED=algo.toLowerCase().replace('-','');
const hash=crypto.createHash(algoFormatted);
hash.update(salt+密码);
返回hash.digest('hex');
}
log(getSecurePassword('test','test','SHA-512');
输出:

125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
9ba1f63365a6caf66e46348f43cdef956015bea997adeb06e69007ee3ff517df10fc5eb860da3d43b82c2a040c931119d2dfc6d08e253742293a868cc2d82015
125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc
对于NodeJS,您可以使用数据附加密钥以获得Java等效哈希

require('crypto').createHash(algo).update(data + key).digest()

根据,您的NodeJS结果是正确的。您正在调用
getBytes()
,但未指定字符编码。根据您的数据和系统上的默认平台编码,这可能会改变您传递的salt和纯文本。。。所以Java代码不是标准的
sha-512
?如果是,我如何复制它@GendarmeThanks@DavidConrad,我尝试在Java代码中添加编码,但这没有帮助(两个代码都在同一个系统上运行),我实际上需要另一种方法(修复JS代码),但这有帮助!:)谢谢