Coldfusion和java加密函数

Coldfusion和java加密函数,java,encryption,coldfusion,Java,Encryption,Coldfusion,在尝试将uservoice的令牌生成器从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、

在尝试将uservoice的令牌生成器从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() />

给出=69686948555367565548685356525265675168665169676566576557656750665506870484950

有人能解释一下吗


谢谢

您实际上得到了相同的结果,但是输出的编码不同。对于Java,它是一个字节数组,需要注意的是,
byte
是有符号的。对于ColdFusion,由于某种原因,每个十六进制字符都以十进制格式输出十六进制。如果您查看十进制数字并将其映射到其字符(例如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);

您实际上得到了相同的结果,但是输出的编码不同。对于Java,它是一个字节数组,需要注意的是,
byte
是有符号的。对于ColdFusion,由于某种原因,每个十六进制字符都以十进制格式输出十六进制。如果您查看十进制数字并将其映射到其字符(例如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);

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

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

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

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


谢谢,这很清楚,但我需要coldfusion中的这个函数,因为我有用java编写的函数代码表,我想翻译成CF。没问题。你的问题只要求解释,而不是CF解决方案:)我不知道CF,所以我不能提供太多。如果你想得到与Java相同的结果,看起来你必须将十六进制解码回一个有符号字节数组。好的,我会尝试找到这样的函数。谢谢,这很清楚,但我需要coldfusion中的这个函数,因为我有用Java编写的函数代码表,我想翻译成CF。没问题。你的问题只要求解释,而不是CF解决方案:)我不知道CF,所以我不能提供太多。如果希望得到与Java相同的结果,那么您必须将十六进制解码回有符号字节数组。好的,我们将尝试找到这样做的函数。