SHA算法

回顾散列算法

我的上篇文章:学习散列表
在上篇文章杂货铺的示例中,我们希望散列函数的结果是均匀分布的。散列函数接受一个字符串,并返回一
个索引号。

安全散列算法(secure hash algorithm, SHA)函数

给定一个字符串, SHA返回其散列值。比如一个hello,sha返回2cf24bd…很长的值
对于每个不同的字符串, SHA生成的散列值都不同。

比较文件内容是否相同
你可使用SHA来判断两个文件是否相同,这在比较超大型文件时很有用。假设你有一个4 GB
的文件,并要检查朋友是否也有这个大型文件。为此,你不用通过电子邮件将这个大型文件发送
给朋友,而可计算它们的SHA散列值,再对结果进行比较。

检查密码
SHA还让你能在不知道原始字符串的情况下对其进行比较。例如,假设Gmail遭到攻击,攻击者窃取了所有的密码!你的密码暴露了吗?没有,因为Google存储的并非密码,而是密码的SHA散列值!你输入密码时, Google计算其散列值,并将结果同其数据库中的散列值进行比较。
SHA算法_第1张图片

SHA被广泛用于计算密码的散列值。**这种散列算法是单向的。**你可根据字符串计算出散列值。但你无法根据散列值推断出原始字符串。

SHA实际上是一系列算法: SHA-0、 SHA-1、 SHA-2和SHA-3。 目前SHA-0和SHA-1已被发现存在一些缺陷。如果你要使用SHA算法来计算密码的散列值,请使用SHA-2或SHA-3。当前,最安全的密码散列函数是bcrypt,但没有任何东西是万无一失的。

提一下MD5消息摘要算法被广泛使用的密码散列函数,相比较SHA-1生成摘要的性能高一些,MD5的摘要的长度尽128bit,SHA-1摘要长度160bit。多出32bit意味着什么呢?不同明文的碰撞几率降低了2^32 = 324294967296倍。

再说一下SHA-2系列算法
SHA-2是一系列SHA算法变体的总称,其中包含如下子版本:

SHA-256:可以生成长度256bit的信息摘要。

SHA-224:SHA-256的“阉割版”,可以生成长度224bit的信息摘要。

SHA-512:可以生成长度512bit的信息摘要。

SHA-384:SHA-512的“阉割版”,可以生成长度384bit的信息摘要。

这么多算法如何应用呢

为了适应不同的应用场景,从而对安全、性能、空间等因素做出权衡。比如说过我的需求仅仅是验证数据完整性,使用SHA-512显然是浪费了。另外,如果想要追求安全性,也可以考虑把多种摘要算法结合使用。比如下面这样:

明文: abcd

MD5摘要:e2fc714c4727ee9395f324cd2e7f331f
SHA-256摘要:88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589

合成摘要:e2fc714c4727ee93209c897823b9217da3e161936f031589

取MD摘要的前16和SHA-256摘要的后32位,拼成一个长度48位的合成摘要。这样除非知道拼接规则,否则外人是无从破解的。

tips:了解更多SHA相关原理访问:https://blog.csdn.net/wufaliang003/article/details/79782168

你可能感兴趣的:(个人学习笔记)