0

我正在使用 Java 的 MessageDigest 来做一个散列项目。我想用随机生成的字符串产生的散列创建冲突。我已经验证我的字符串是真正随机的。但是,当我输出摘要时,由于某种原因,它总是以“[B@”开头,而当我试图检测与 8 位的冲突时,显然一切都以“[”开头。这是我的代码:

public boolean encrypt(String x) throws Exception {
    System.out.println("x is " + x);
    java.security.MessageDigest d = java.security.MessageDigest.getInstance("SHA-1");
    d.update(x.getBytes());
    d.reset();
    String result = d.digest().toString() + "     ";
    char[] tempCharArray = result.toCharArray();
    String bitArray = "";
    for(int i=0; i< tempCharArray.length; i++){
        bitArray += String.format("%8s", Integer.toBinaryString(tempCharArray[i] &
          0xff)).replace(' ', '0');
    }

    result = bitArray.substring(0,8);
    return result;
}

有没有人见过这个/知道该怎么做才能让它正确吗?谢谢

4

1 回答 1

2

你看起来在你的代码中做了一些奇怪的事情。

首先,你打电话;

String result = d.digest().toString()

..这将为您提供字节数组对象的字符串表示形式,该对象由类名、“@”符号和哈希码组成。数组有一个类名 "[B",因此你总是会得到一些以 "[B@" 开头的东西。

其次你打电话d.update(x.getBytes()),然后立即打电话d.reset()。即使您解决了第一个问题,无论 的值如何,您都不会消化任何内容x,因此您将始终得到相同的结果,即空字符串的 SHA-1 哈希,即da39a3ee5e6b4b0d3255bfef95601890afd80709.

于 2015-03-09T13:44:45.443 回答