SHA-256 有什么用?以及如何在 Java 中创建它?

What is SHA-256 for? And how to create it in Java?

我从一本书上读到 SHA-256,但是这本书没有解释它的用途?该书在 Java 中解释了如何创建它。但是,我不明白 Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)) 是干什么用的。有人可以向我详细解释一下吗?

SHA-256被称为哈希算法,其目的很简单:它获取任何数据并生成一个唯一的字节序列来表示它。没有办法逆转这个过程,并且没有已知的 SHA-256 散列不是唯一的实例。

相关代码行的目的是生成最终 SHA-256 输出的一个字符。 Java 为您提供原始数据(字节数组)中的 has,我们通常将其转换为十六进制以将其表示为字符串。这行代码非常复杂,所以我将分别介绍它的每个部分的作用。

sb.append(); 正在接受输入并将其添加到存储在 StringBuilder 中的结果中。

Integer.toString(); 取一个数字并将其表示为文字字符串

byteData[i] & 0xff选择hash数据的当前字节,使用0xff进行按位与运算(所以对于字节中的每一位,如果0xff中对应的位相同,则输出为1,如果不是,则输出为 0。

string.substring(1); 输出从第一个字符开始的字符串。

Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))

是一种将字节值转换为恰好两个字符宽的字符串的方法,显示字节的十六进制值。看看 String's Javadoc page 会有帮助。

0x100substring(1) 的组合确保小于十进制 16 的字节值(即十六进制的 0 到 F)也表示为两个字符。

顺便说一句:

String.format("%02x",byteData[i])

完全一样,并且可能被认为更具可读性,尤其是对于习惯了 C printf 样式格式字符串的人来说。

最后,为什么要 (byteData[i] & 0xff)?详细解释见here

It works because Java will perform a widening conversion to int, using sign extension, so instead of a negative byte you will have a negative int. Masking with 0xff will leave only the lower 8 bits, thus making the number positive again (and what you initially intended).