2011-04-16 37 views
1

试图翻译从Java中的ColdFusion UserVoice的令牌生成器,我注意到在Java中的散列函数可以执行一个ColdFusion的:ColdFusion和Java的加密功能

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

任何人都可以解释这一点吗?

谢谢

回答

3

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

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

它完美地工作,谢谢。 – Houssem 2011-04-17 09:18:24

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("ABCDEF".charAt((b & 0xF0) >> 4)); 
    sb.append("ABCDEF".charAt((b & 0x0F))); 
} 
String hex = sb.toString(); 
System.out.println(hex); 
+0

谢谢,这很清楚,但我需要在ColdFusion的这个功能的原因,我有函数编写的Java代码表,我想翻译为CF. – Houssem 2011-04-16 22:14:34

+0

没问题。你的问题只是要求解释而不是CF解决方案:)虽然我不知道CF,所以我不能在那里提供太多。如果你想得到与Java相同的结果,看起来你必须将十六进制解码为一个有符号的字节数组。 – WhiteFang34 2011-04-16 22:46:43

+0

好的,会尝试找到做的功能。 – Houssem 2011-04-16 23:14:59