Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SHA-256是干什么用的?如何在Java中创建它?_Java_Security_Hash_Hex_Sha - Fatal编程技术网

SHA-256是干什么用的?如何在Java中创建它?

SHA-256是干什么用的?如何在Java中创建它?,java,security,hash,hex,sha,Java,Security,Hash,Hex,Sha,我读过一本书中的SHA-256,但这本书没有解释它的用途?这本书解释了如何用Java创建它。但是,我无法理解Integer.toString((byteData[I]&0xff)+0x100,16).子字符串(1))的用途。有人能给我详细解释一下吗 SHA-256被称为哈希算法,其目的很简单:它接受任何数据并生成唯一的字节序列来表示它。无法逆转此过程,并且没有已知的SHA-256哈希不唯一的实例 所述代码行的目的是生成最终SHA-256输出的一个字符。Java为您提供原始数据中的has(字节数组

我读过一本书中的SHA-256,但这本书没有解释它的用途?这本书解释了如何用Java创建它。但是,我无法理解
Integer.toString((byteData[I]&0xff)+0x100,16).子字符串(1))
的用途。有人能给我详细解释一下吗


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

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

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

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

byteData[i]&0xff
选择散列数据的当前字节,并使用0xff进行逐位and运算(因此,对于字节中的每个位,如果0xff中的对应位相同,则输出为1,如果不是,则输出为0)

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

Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))
是一种将字节值转换为两个字符宽的字符串的方法,显示字节的十六进制值。查看一下会有所帮助

0x100
子字符串(1)
的组合确保小于16位小数(即十六进制中的0到F)的字节值也表示为两个字符

顺便说一下:

String.format("%02x",byteData[i])
做完全相同的事情,并且可能被认为更可读,特别是对于习惯C printf样式格式字符串的人

最后,为什么
(byteData[i]&0xff)
?有关详细说明,请参阅:

这是因为Java将使用 符号扩展名,因此将使用负字节而不是负字节 int.使用0xff屏蔽将只保留较低的8位,因此 数字再次为正(以及您最初的预期)


SHA-256与将数字转换为十六进制无关。SHA-256是一种哈希算法。但说真的:如果您不知道这是怎么回事,请忘记使用它。通常,您需要哈希和加密来实现某种程度的“安全性”。但这不是初学者的主题。换句话说:就此类主题提出此类问题意味着你最好留意其他主题。那么,我应该学习什么主题呢?我自己学习编程。因此,我不知道下一步应该做什么。你能举一个将字节转换为十六进制的例子吗?这正是
整数.toString
和我的
字符串.format
建议所做的,所以我不明白你的问题?现在我知道如何将其转换为十六进制,但我还有一个问题:&0xff重要吗?字节不总是等于8位吗?那么为什么我们需要确保它是8位?谢谢!@LukasHerman忘记前面的评论,我用正确的解释扩展了我的答案。谢谢。现在这是有意义的。你的答案也很好,但你没有解释“0x100”的用途。我感谢你的帮助。