【问题标题】:Why does the SHA-1 algorithm produce different values for the same input value?为什么 SHA-1 算法会为相同的输入值产生不同的值?
【发布时间】:2012-06-07 08:55:43
【问题描述】:

在这里,我附上我的代码,涉及手动给出的相同输入值的基于“SHA-1”算法的 Java 代码:

import java.security.MessageDigest;    
import java.security.NoSuchAlgorithmException;    
import sun.misc.BASE64Encoder;

public class NewClass {       
 public static void main(String args[]) throws NoSuchAlgorithmException        
 {       
    MessageDigest digest = MessageDigest.getInstance("SHA-1");    
    System.out.println("Algorithm :"+digest.getAlgorithm());    
    digest.update("welcome".getBytes());    
    byte[] result = digest.digest();     
    hash = (new BASE64Encoder()).encode(result);     
    MessageDigest digest1 = MessageDigest.getInstance("SHA-1");    
    digest1.update("welcome".getBytes());    
    byte[] result1 = digest1.digest();    
    System.out.println(result);    
    System.out.println(result1);    
    String hash1 = (new BASE64Encoder()).encode(result);    
    System.out.println("Digest value"+hash);    
    System.out.println("Digest value"+hash1);       
 }

}

输出:

Algorithm :SHA-1

[B@42e816

[B@9304b1

Digest value wLE3/i15JFnyb/djzORFdKW1qwM=

Digest value wLE3/i15JFnyb/djzORFdKW1qwM=

上述算法产生相同的哈希码,但中间值不同。这是为什么呢?

【问题讨论】:

  • 我不回答你的问题,但我想你有错过String hash1 = (new BASE64Encoder()).encode(result);,应该是result1。

标签: java sha sha1


【解决方案1】:

[B@42e816 是您尝试在 Java 中打印数组时得到的结果。它只打印它的内存地址,而不是内容。显然,两个不同的数组会有不同的地址。

【讨论】:

    【解决方案2】:

    这两行没有意义:

    System.out.println(result);
    System.out.println(result1);
    

    不要像您期望的那样打印两个字节数组的内容。而是打印类型([B 代表字节数组)和一个可以被认为是数组的内存地址的数字。

    要打印字节数组的内容,请使用 Base 64 编码并打印结果字符串。我相信它们会是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多