Coldfusion和java加密函数

时间:2011-04-16 21:26:24

标签: java encryption coldfusion

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

String salted = "63bfb29835aedc55aae944e7cc9a202dmbdevsite";
byte[] hash = DigestUtils.sha(salted);

给出= [-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() />

给予= 69686969485553675655486853565252656751686651696765665765576567506665506870484950

任何人都能解释一下吗?

由于

2 个答案:

答案 0 :(得分:5)

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

EDEE075C870D5844AC3DB3ECAB9A9AC2BA2DF012

散列结果通常存储为十六进制。如果您将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);

答案 1 :(得分:3)

您可以使用BinaryDecode获取与Java Hash相同的字节数组。

<cfset Salted="63bfb29835aedc55aae944e7cc9a202dmbdevsite" />
<cfset hash = Hash(Salted,"SHA") />
<cfset arrBytes = BinaryDecode(hash, "hex") />