加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java和C#中计算SHA-1哈希值

发布时间:2020-12-15 00:25:47 所属栏目:Java 来源:网络整理
导读:在 Java和C#中计算SHA-1哈希值 我正在尝试在C#应用程序中复制Java应用程序的逻辑.部分原因是生成密码的SHA-1哈希.不幸的是,我无法从Java和C#获得相同的结果. C# Output : 64 0a b2 ba e0 7b ed c4 c1 63 f6 79 a7 46 f7 ab 7f b5 d1 faJava Output: 164 10a
在 Java和C#中计算SHA-1哈希值

我正在尝试在C#应用程序中复制Java应用程序的逻辑.部分原因是生成密码的SHA-1哈希.不幸的是,我无法从Java和C#获得相同的结果.

C# Output  : 64  0a  b2 ba e0 7b  ed c4 c1 63  f6 79  a7 46  f7 ab 7f  b5 d1 fa
Java Output: 164 10a b2 ba e0 17b ed c4 c1 163 f6 179 a7 146 f7 ab 17f b5 d1 fa 

为了弄清楚发生了什么,我一直在Eclipse和Visual Studio中使用Debugger.

1. Check values of byte[] key:

    Java: { 84,101,115,116 }
    C#  : { 84,116 }

2. Check value of byte[] hash:

    Java: { 100 10 -78 -70 -32 123 ... }
    C#  : { 100 10  78 186 224 123 ... }

我已经阅读了关于这个主题的其他帖子,主要是指输入字符串编码,但这些似乎没有帮助我.我的猜测是这与有符号和无符号字节有关,但我在这条轨道上没有取得多大进展.任何帮助将不胜感激.

谢谢,

Karle

Java版本:

public void testHash() {

    String password = "Test";

    byte[] key = password.getBytes();

    MessageDigest md = MessageDigest.getInstance("SHA-1");

    byte[] hash = md.digest(key);

    String result = "";
    for ( byte b : hash ) {
        result += Integer.toHexString(b + 256) + " ";
    }

    System.out.println(result);

}

C#版本:

public void testHash() {

    String password = "Test";

    byte[] key = System.Text.Encoding.Default.GetBytes(password);

    SHA1 sha1 = SHA1Managed.Create();

    byte[] hash = sha1.ComputeHash(key);

    String result;
    foreach ( byte b in hash ) {
        result += Convert.ToInt32(b).ToString("x2") + " ";
    }

    Console.WriteLine(result);

}

解决方法

在Java版本中,不要使用b 256;相反,使用b& 255. SHA-1部分很好,这只是打印输出的问题. Java的“字节”类型是有符号的:它返回-128到127之间的值.要获得相应的无符号值,只有在值为负时才必须添加256.

与255一起的按位AND(即“& 255”所做的)操作正确的转换,在二进制级别,该值是将值截断为其8个最低有效位.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读