Java SHA-512函数仅产生508位输出?

时间:2019-05-20 21:22:54

标签: java string substring sha sha512

我有一个遍历并散列的数据点。我正在使用SHA-512的Java实现来哈希我的数据。散列应该产生一个128个字符串,但偶尔会产生一个127个字符串,这导致我的代码超出范围。

代码通常会在计算出的每20个不同哈希值中产生不正确的长度哈希值1。

这是我用来实现哈希的代码,它来自 https://www.geeksforgeeks.org/sha-512-hash-in-java/

public static String SHA512(String input) 
{ 
    try { 
        // getInstance() method is called with algorithm SHA-512 
        MessageDigest md = MessageDigest.getInstance("SHA-512"); 

        // digest() method is called 
        // to calculate message digest of the input string 
        // returned as array of byte 
        byte[] messageDigest = md.digest(input.getBytes()); 

        // Convert byte array into signum representation 
        BigInteger no = new BigInteger(1, messageDigest); 

        // Convert message digest into hex value 
        String hashtext = no.toString(16); 

        // Add preceding 0s to make it 32 bit 
        while (hashtext.length() < 32) { 
            hashtext = "0" + hashtext; 
        } 

        // return the HashText 
        return hashtext; 
    } 

    // For specifying wrong message digest algorithms 
    catch (NoSuchAlgorithmException e) { 
        throw new RuntimeException(e); 
    } 
} 

这是上面列出的代码产生的正确长度的哈希(128个字符): ca36f8a40a6211d49e77f84ca37182813fba853fba732e29d18414c739b85f856fd3af702a2cd23174eeaedf2d99a044b0ae0ddea17de7bbb33e3b62cfec5236

这是上面列出的代码产生的长度不正确的哈希(127个字符): d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661

2 个答案:

答案 0 :(得分:1)

将while循环条件从< 32更改为< 128可以解决此问题。这是有道理的,因为代码应生成128个十六进制数字字符串(512位),而不是32个十六进制数字字符串(128位)。看来这是OP的代码中列出的错误。

答案 1 :(得分:0)

您正在将哈希转换为十六进制字符串。平均十六分之一的哈希将以二进制0b0000开头,这将在十六进制转换中给出前导零,就像256分之一的哈希将以0b000000000x00开始一样。检查您的十六进制转换是否未去除前导零。