如何在Java中复制javascript sha256哈希并获得相同的Hex输出



我需要在groovy/java应用程序中用java复制一个javascript sha256哈希。

javascript版本使用angular中包含的hash函数,我无法控制它。给定相同的输入字符串,我需要提供相同的Hex输出。

在java中,我使用https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html

在java:中

DigestUtils.sha256(cx2 + username):

给我一个字节字符串,打印为:

[-114,-15,57,-56,81,37,-95,119,102,81,63,99,-3,-56,-110,-114,-16,-18117,118,49,-120,14,68,30,-37,20,-70,-17,-19,-88]

在java脚本中:

var s1 = Sha256.hash(cx2 + username)

给我一个字节串(Javascript的类型会说它是字符串(,打印如下(不确定是什么编码(:

ñ9ÉQ%?cý

如果我将两个字节字符串都转换为Hex,那么在java和javascript中都会得到相同的结果:

console.log Sha256.toHexStrfromByteStr(s1)
// 478972ab3380187060494987ac7c597ac92decdac1c04dd1dcab8184995ec01b

就是这样,除了javascript代码做第二个散列,将字节串连接到另一个字符串:

var s2 = Sha256.hash(cx1 + s1)

当我尝试在Java中复制第二个散列时,我得到了一个非常不同的输出(在将两个输出都转换为十六进制之后(。

def s2 = DigestUtils.sha256(cx1 + s1)

我缺了一步吗?

import org.apache.commons.codec.digest.DigestUtils
String cx2 =  'Potato'
String cx1 = 'Bread'
def s1 = DigestUtils.sha256(cx2 + 'username')  
def s2 = DigestUtils.sha256Hex(cx1 + s1)
println s2

Javascript

var s1 = Sha256.hash(cx2 + 'username');
var s2 = Sha256.hash(cx1 + s1);
console.log (Sha256.toHexStrfromByteStr(s2))

万分感谢!

通过进行

def s1 = DigestUtils.sha256(cx2 + 'username')

结果CCD_ 1具有类型CCD_。然后,通过进行

def s2 = DigestUtils.sha256Hex(cx1 + s1)

您正在将<byte []>.toString()的结果连接到cx1

您必须:

a( 将s1转换为"普通"字符串-new String(s1)-并连接两个字符串,或者
b(将cx1转换为byte[]并连接两组数组。

最新更新