【问题标题】:Understanding SHA-256 Hashing了解 SHA-256 哈希
【发布时间】:2023-03-18 02:59:02
【问题描述】:

我在我的 Java 程序中使用 Sha-256 散列,它按照行为工作。

我实际上对我用于 SHA-256 的函数有点困惑。

以下是函数的代码:

// Function for generating to Hash of the file content..
    public static String generateHash( String fileContent ) 
     {
        String hashtext = EMPTY_STRING;

        try {

            // SHA - 256 Message Digest..
            MessageDigest shaDigest = MessageDigest.getInstance( "SHA-256" );

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

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

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

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

        }
        catch ( Exception hashingException ) {

            System.out.println( "Exception in Hashing of Content = " + hashingException );

        }
         // return the HashText 
         return hashtext; 
     }

现在,我对三个陈述感到困惑;因为我不知道它们的实际目的是什么,因为我在互联网上浏览过它们但没有得到任何解释性的东西。谁能给我详细说明这三个步骤?

声明 1

BigInteger no = new BigInteger( 1, messageDigest ); 

声明 2

 hashtext = no.toString( 16 );

声明 3

while ( hashtext.length() < 32 ) { 
    hashtext = "0" + hashtext;
}

【问题讨论】:

    标签: java sha256


    【解决方案1】:
    BigInteger no = new BigInteger( 1, messageDigest ); 
    

    将字节转换为正符号幅度表示。阅读Javadoc了解更多信息。

    hashtext = no.toString( 16 );
    

    BigInteger 数字转换为 Base 16(十六进制十进制)字符串

    while ( hashtext.length() < 32 ) { 
        hashtext = "0" + hashtext;
    }
    

    添加 0 直到哈希文本的大小为 32。

    【讨论】:

    • 但是 SHA-256 的长度应该是 64 个字符吧?那为什么将其限制为 32?
    • SHA-256 有 8 位 * 32 = 256 位初始状态大小。
    • 如果我错了请纠正我:哈希是十六进制表示。首先我们将 Message 转换为字节字节序,然后将其从有符号幅度更改为 Big Integer 以去除负号,然后将其转换为十六进制表示;现在 while 循环检查它是否少于 32 个字节(半个字节组成 1 个十六进制值意味着 32 个字节将组成 SHA-256 的 64 个字符)然后附加零使其成为 32 个字节并打印散列!跨度>
    • 如果散列的长度是 256 位,表示为 64 位十六进制数字的散列文本字符串,很明显在哪里修复它。把 32 改成 64,就大功告成了。不要忘记创建一个生成以“0”开头的哈希的测试用例。
    猜你喜欢
    • 2014-08-19
    • 2013-01-09
    • 2021-01-22
    • 2020-06-29
    • 2021-11-25
    • 1970-01-01
    • 2020-04-16
    • 2011-03-22
    • 2012-09-12
    相关资源
    最近更新 更多