如何在 Java 中复制 javascript sha256 散列并获得相同的十六进制输出?
How can I replicate a javascript sha256 hash in Java and get the same Hex output?
我需要在我的 groovy/java 应用程序的 java 中复制一个 javascript sha256 散列。
java脚本版本使用了angular中包含的散列函数,我无法控制它。给定相同的输入字符串,我需要提供相同的十六进制输出。
在 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, -116, -110, -114, - 16, -18, 117, 118, 49, -120, 14, 68, 30, -37, 20, -70, -17, -19, -88]
在 java 脚本中:
var s1 = Sha256.hash(cx2 + username)
给我一个字节串(Java脚本的类型会说它是一个字符串)打印如下的东西(不确定那是什么编码):
ñ9ÈQ%¡wfQ?cýÈðîuv1DÛºïí¨
如果我将两个字节串都转换为十六进制,我在 java 和 javascript 中得到相同的结果:
console.log Sha256.toHexStrfromByteStr(s1)
// 478972ab3380187060494987ac7c597ac92decdac1c04dd1dcab8184995ec01b
就是这样,除了 java 脚本代码执行第二个哈希将字节串连接到另一个字符串:
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
Java脚本
var s1 = Sha256.hash(cx2 + 'username');
var s2 = Sha256.hash(cx1 + s1);
console.log (Sha256.toHexStrfromByteStr(s2))
万分感谢!
通过
def s1 = DigestUtils.sha256(cx2 + 'username')
结果 s1
的类型为 byte[]
。然后,通过做
def s2 = DigestUtils.sha256Hex(cx1 + s1)
您正在将 <byte []>.toString()
的结果连接到 cx1
。
您必须改为:
a) 将 s1
转换为 "normal" 字符串 - new String(s1)
- 并连接两个字符串,或
b) 将 cx1
转换为 byte[]
并连接两个数组。
我需要在我的 groovy/java 应用程序的 java 中复制一个 javascript sha256 散列。
java脚本版本使用了angular中包含的散列函数,我无法控制它。给定相同的输入字符串,我需要提供相同的十六进制输出。
在 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, -116, -110, -114, - 16, -18, 117, 118, 49, -120, 14, 68, 30, -37, 20, -70, -17, -19, -88]
在 java 脚本中:
var s1 = Sha256.hash(cx2 + username)
给我一个字节串(Java脚本的类型会说它是一个字符串)打印如下的东西(不确定那是什么编码):
ñ9ÈQ%¡wfQ?cýÈðîuv1DÛºïí¨
如果我将两个字节串都转换为十六进制,我在 java 和 javascript 中得到相同的结果:
console.log Sha256.toHexStrfromByteStr(s1)
// 478972ab3380187060494987ac7c597ac92decdac1c04dd1dcab8184995ec01b
就是这样,除了 java 脚本代码执行第二个哈希将字节串连接到另一个字符串:
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
Java脚本
var s1 = Sha256.hash(cx2 + 'username');
var s2 = Sha256.hash(cx1 + s1);
console.log (Sha256.toHexStrfromByteStr(s2))
万分感谢!
通过
def s1 = DigestUtils.sha256(cx2 + 'username')
结果 s1
的类型为 byte[]
。然后,通过做
def s2 = DigestUtils.sha256Hex(cx1 + s1)
您正在将 <byte []>.toString()
的结果连接到 cx1
。
您必须改为:
a) 将 s1
转换为 "normal" 字符串 - new String(s1)
- 并连接两个字符串,或
b) 将 cx1
转换为 byte[]
并连接两个数组。