Coldfusion和java加密函数

Hou*_*sem 1 java encryption coldfusion

在尝试将用户运动的令牌生成器从java转换为coldfusion时,我注意到java中的哈希函数在coldfusion中执行了一个:

String salted = "63bfb29835aedc55aae944e7cc9a202dmbdevsite";
byte[] hash = DigestUtils.sha(salted);
Run Code Online (Sandbox Code Playgroud)

给出= [-19,-18,7,92,-121,13,88,68,-84,61,-77,-20,-85,-102,-102,-62,-70,45, -16,18]

<cfset Salted="63bfb29835aedc55aae944e7cc9a202dmbdevsite" />
<cfset hash=Hash(Salted,"SHA") />
<cfset arrBytes = hash.GetBytes() />
Run Code Online (Sandbox Code Playgroud)

给出= 69686969485553675655486853565252656751686651696765665765576567506665506870484950

有谁能解释一下?

谢谢

Whi*_*g34 5

实际上,您获得了相同的结果,但输出的编码方式不同.对于Java,它是一个字节数组,重要的是要注意byte已签名.对于ColdFusion,您将获得十六进制,由于某种原因,每个十六进制字符以十进制格式输出.如果您查看http://asciitable.com/并将十进制数字映射到它们的字符(例如69到E,68到D,48到0),您会得到:

EDEE075C870D5844AC3DB3ECAB9A9AC2BA2DF012
Run Code Online (Sandbox Code Playgroud)

散列结果通常存储为十六进制.如果将Java版本编码为十六进制,您将获得相同的结果:

byte[] bytes = { -19, -18, 7, 92, -121, 13, 88, 68, -84, 61, -77, -20,
        -85, -102, -102, -62, -70, 45, -16, 18 };

StringBuilder sb = new StringBuilder(2 * hash.length);
for (byte b : hash) {
    sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
    sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
System.out.println(hex);
Run Code Online (Sandbox Code Playgroud)