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

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字节,则需要用零填充。 例:

  • 我正在写一个Django应用程序,需要与现有的Java播放框架应用程序一起工作。Play应用程序使用PasswordHash.java来存储密码。它以冒号分隔的格式存储密码。每个哈希都存储为::。 例如,下面是密码“测试”的条目: 在这里,我们可以通过拆分字符串并找到: 迭代次数: 盐: PBKDF2哈希:。 我修改了Django的check_密码机制以与此格式兼容,但发现它认为密码不正确。我用了