javascript - 如何在 Java 中复制 javascript sha256 哈希并获得相同的十六进制输出?
问题描述
我需要在我的 groovy/java 应用程序中复制 java 中的 javascript sha256 哈希。
javascript 版本使用 angular 中包含的哈希函数,我无法控制它。给定相同的输入字符串,我需要提供相同的十六进制输出。
在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)
给了我一个字节串(Javascript的类型会说它是一个字符串)打印如下(不确定那是什么编码):
ñ9ÈQ%¡wfQ?cýÈðîuv1DÛºïí¨
如果我将两个字节串都转换为十六进制,我会在 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')
结果s1
有类型byte[]
。然后,通过做
def s2 = DigestUtils.sha256Hex(cx1 + s1)
你正在连接<byte []>.toString()
to的结果cx1
。
您必须改为:
a) 转换s1
为“普通”字符串 - new String(s1)
- 并连接两个字符串,或
b) 转换cx1
为byte[]
并连接两个数组。
推荐阅读
- ruby-on-rails - 如何在rails应用程序的表中不保存属性的情况下访问数据
- sqlalchemy - 连接两个不同数据库上的表以使用 SQLAchemy 进行查询?
- c# - 在 C# 中,有没有办法实现抽象类,以便使用提供的第一个参数自动调用基本构造函数?
- javascript - 如何在不手动输入 javascript 中的每个图像文件的情况下从文件夹中循环图像?
- python - 碰撞仅在精灵在 x 轴上移动时按预期工作
- python - 如何使用带有 input() 函数的多处理并避免“EOFError: EOF when reading a line”?
- go - 什么是正确的
- karate - 空手道 UI:如何单击具有相同类名的特定复选框
- javascript - 使用 ajax 从后端检索 HTML,然后使用 jquery 切片不起作用
- mysql - 案例陈述和加入