当前位置: 首页 > 面试题库 >

Java和C#之间的SHA1哈希结果不同

祁博雅
2023-03-14
问题内容

我有一个大问题。我使用此C#函数对消息进行编码:

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#)   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哈希算法将传递不同的参数,从而导致不同的返回值。



 类似资料:
  • 问题内容: 我在Java中有以下代码: 以及C#中的以下代码: 字节数组“ secretKey”和“ bytes”是等效的,但字节数组“ rawHmac”不同,字符串“ result”不同。谁能看到原因? 问题答案: 不要这样做: 这将使用平台默认编码将字符串转换为字节数组。平台之间可能会有所不同,而您想要一些可重复的东西。我建议使用UTF-8: (当然,对密钥执行相同的操作。) 然后,您应该在C

  • 问题内容: 我从http://tools.ietf.org/html/rfc6238借用了HMAC- SHA1 Java代码,并稍加修改以对其进行硬编码,以使用一个具有已知输出的已知密钥/消息对。 然后,我尝试在Python中编写相同的代码以验证结果,但是在Python和Java中获得了不同的值。 已知Java值很好。 Java代码: Python代码: 运行Java的结果: 运行Python的结

  • 问题内容: 我从http://tools.ietf.org/html/rfc6238借用了HMAC- SHA1 Java代码,并稍加修改以对其进行硬编码,以使用一个具有已知输出的已知密钥/消息对。 然后,我尝试在Python中编写相同的代码以验证结果,但是在Python和Java中获得了不同的值。 Java值众所周知是好的。 Java代码: Python代码: 运行Java的结果: 运行Pytho

  • 问题内容: 我面临着一个奇怪的问题,它与Java和php5中的MD5-Hashes有关。我发现在某些情况下,以下代码无法生成正确的MD5哈希值: 我不得不迁移现有的用户数据库,密码存储在php5 MD5中。现在,部分用户(并非全部)无法登录,因为我的Java代码无法生成正确的MD5哈希。 任何想法上面有什么问题吗? 问题答案: 无法正确转换<0x10字节,则需要用零填充。 例:

  • 问题内容: 我对加密/哈希知之甚少。 我必须对加密密钥进行哈希处理。Java中的示例是这样的… 现在,如果我错了,请纠正我,但是上面的代码使用MD5算法对字符串进行了哈希处理。 当我在C#中哈希相同的字符串时,我希望得到相同的结果。 我当前的C#代码看起来像这样… 但是末字节结果不匹配。 Java得到… C#得到… 我需要C#代码才能获得与Java代码相同的结果(不是相反),有什么想法吗? 谢谢。