Java和C之间不同的SHA1哈希结果#
我遇到了一个很大的问题。 我用这个C#函数来编码我的留言:Java和C之间不同的SHA1哈希结果#
byte[] buffer = Encoding.ASCII.GetBytes(file_or_text);
SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
String hashText = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
在Java方面,我用这个片段:
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = new byte[40];
md.update(text.getBytes("iso-8859-1"), 0, text.length());
sha1hash = md.digest();
我的信息是:座|注意事项|文字£$%& /( ?)= ^€> < {} C°§;:_-,@#ùàòè+
我有这样的结果:
(C#) 8EDC7F756BCECDB99B045FA3DEA2E36AA0BF0875
(Java) 2a566428826539365bb2fe2197da91395c2b1b72
你能帮我吗? 谢谢...
我的猜测是你似乎在比较ASCII字节到Latin1字节。尝试切换
md.update(text.getBytes("iso-8859-1"), 0, text.length());
这个
md.update(text.getBytes("ISO646-US"), 0, text.length());
这可能会解决你的问题。
(或交换机C#使用Latin1的)
什么是发生在你的计划中的GetBytes
方法是相同的字符根据编码返回不同的值,从而使我们的漂亮的SHA1哈希算法获得通过不同的参数不同的回报值。
我可以在C#端更改代码吗? 在Java方面对我来说更加困难...(我无法触及Java方面) – CeccoCQ 2010-07-08 15:18:45
Jon Skeet在他的帖子中解释了它。 – Meiscooldude 2010-07-08 15:27:24
谢谢,我已阅读你的答案。你是我的C#神! :) – CeccoCQ 2010-07-08 15:27:27
的变化使用ISO-8859-1的C#方很简单:
byte[] buffer = Encoding.GetEncoding(28591).GetBytes(file_or_text);
然而,无论这一点,如果你的文本中包含上述U + 00FF的Unicode字符的ASCII数据就会丢失。理想情况下,如果您的源数据是真正的文本,您应该使用能够处理任何内容(如UTF-8)的编码,并且如果您的源数据实际上是二进制文件,则根本不应该经历文本编码。
试试下面的代码:
public static string Sha1encode(string toEncrypt) {
// Produce an array of bytes which is the SHA1 hash
byte[] sha1Signature = new byte[40];
byte[] sha = System.Text.Encoding.Default.GetBytes(toEncrypt);
SHA1 sha1 = SHA1Managed.Create();
sha1Signature = sha1.ComputeHash(sha);
// The BASE64 encoding standard's 6-bit alphabet, from RFC 1521,
// plus the padding character at the end.
char[] Base64Chars = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4',
'5', '6', '7', '8', '9', '+', '/', '=' };
// Algorithm to encode the SHA1 hash using Base64
StringBuilder sb = new StringBuilder();
int len = sha1Signature.Length;
int i = 0;
int ival;
while (len >= 3) {
ival = ((int) sha1Signature[i++] + 256) & 0xff;
ival <<= 8;
ival += ((int) sha1Signature[i++] + 256) & 0xff;
ival <<= 8;
ival += ((int) sha1Signature[i++] + 256) & 0xff;
len -= 3;
sb.Append(Base64Chars[(ival >> 18) & 63]);
sb.Append(Base64Chars[(ival >> 12) & 63]);
sb.Append(Base64Chars[(ival >> 6) & 63]);
sb.Append(Base64Chars[ival & 63]);
}
switch (len) {
case 0: // No pads needed.
break;
case 1: // Two more output bytes and two pads.
ival = ((int) sha1Signature[i++] + 256) & 0xff;
ival <<= 16;
sb.Append(Base64Chars[(ival >> 18) & 63]);
sb.Append(Base64Chars[(ival >> 12) & 63]);
sb.Append(Base64Chars[64]);
sb.Append(Base64Chars[64]);
break;
case 2: // Three more output bytes and one pad.
ival = ((int) sha1Signature[i++] + 256) & 0xff;
ival <<= 8;
ival += ((int) sha1Signature[i] + 256) & 0xff;
ival <<= 8;
sb.Append(Base64Chars[(ival >> 18) & 63]);
sb.Append(Base64Chars[(ival >> 12) & 63]);
sb.Append(Base64Chars[(ival >> 6) & 63]);
sb.Append(Base64Chars[64]);
break;
}
string base64Sha1Signature = sb.ToString();
return base64Sha1Signature;
}
你能说出他在做什么来造成这种差异吗? – 2012-10-10 20:06:08
你为什么要使用ISO-8859-1编码在Java代码片段,而不是在C#代码段? – Lazarus 2010-07-08 15:15:56
计算哈希值之前的字节数组是什么?他们可能不一样(也许是因为你使用ASCII和ISO-8850-1编码) – Progman 2010-07-08 15:16:13
看看http://*.com/questions/4819794/sha1-c-sharp-equivalent-of-this-java – Koekiebox 2012-03-28 07:06:03