2016-04-14 102 views
0

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

enter image description here

+1

https://en.wikipedia.org/wiki/Cryptographic_hash_function#Applications –

+0

SHA-256与将数字转换为十六进制无关。 –

+1

SHA 256是一种哈希算法。但是,严肃地说:如果你不知道这是什么意思,忘记使用它。通常情况下,您需要哈希和密码以达到某种“安全性”级别。但这不是初学者的话题。换句话说:就这些问题询问这些问题意味着你最好留意其他要研究的主题。 – GhostCat

回答

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

是一个WA y将字节值转换为非常宽的字符串,显示字节的十六进制值。看看String's Javadoc page将有所帮助。

0x100substring(1)的组合确保字节值<小于十六进制数(也就是说,十六进制中的0到F)也表示为两个字符。

顺便说一句:

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

不完全一样,并且可能被认为更具可读性,尤其是通过谁是用来C的printf风格的格式字符串的人。

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

它的工作原理,因为Java将执行扩大转换为int,使用 符号扩展,所以不是一个消极的字节,你将有一个负 INT。用0xff掩码将只留下较低的8位,从而使 的数字再次为正数(以及您最初的计划)。

+0

你能举一个字节转换为十六进制的例子吗? –

+0

这正是'Integer.toString'和我的'String.format'建议所做的,所以我不明白你的问题? – fvu

+0

现在我明白如何将其转换为十六进制,但我还有一个问题。是&0xff重要吗?不总是等于8位?那么为什么我们需要确保它是8位?谢谢! –

0

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

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

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

Integer.toString();注意到一个数,表示它作为文字串

byteData[i] & 0xff选择散列数据的当前字节,并且使用按位与运算用0xff的(所以在字节的每个比特,如果在0xff的对应的位是相同的,输出是1,如果不输出是0。

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

+0

你的答案也很好,但你没有解释“0x100”是什么。我感谢您的帮助。 –

相关问题