SHA-256 算法介绍

Hash(哈希或散列)算法是非常基础和重要的计算机算法,它能将任意长度的二进制明文映射为较短的固定长度的二进制Hash值,并且不同的明文很难映射为相同的Hash值。

SHA-256 是一种 Hash 算法,在比特币源码中被广泛采用。

例如:

SHA-256(123456) = 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

SHA-256(比特币) = 51dd3e54432330d5477f9ef2c4f736ac90af247c91e01a3eb459668f423ed268

以上两个例子,第一个 SHA-256(123456) 例子和第二个 SHA-256(比特币) 例子,通过 SHA-256 算法把不同长度的明文字符映射为固定长度字符。

1. 常见 Hash 算法

目前常见的 Hash 算法包括 MD5 和 SHA(包括:SHA-1、SHA-2、SHA-3)。

MD4(RFC 1320) 是 MIT 的 Ronald L.Rivest 在1990年设计的,MD 是 Message Digest 的缩写,其输出为 128 位。MD4已被证明不够安全。

MD5(RFC 1321) 是 Rivest 于1991年对 MD4 的改进版本。它对输入仍以 512 位进行分组,其输出是128位。

MD5 比 MD4 更加安全,但是过程更加复杂,计算速度也慢一些。MD5 也已被证明不具备强抗碰撞性。

SHA(Secure Hash Algorithm) 并非一个算法,而是一个 Hash 函数族。

NIST(NationalInstitute of Standards andTechnology)于 1993 年发布了首个实现。

知名的 SHA-1 算法 1995 年面世,它输出长度 160 位的Hash值,抗穷举性更好。

SHA-1设计模仿了 MD4 算法,采用类似原理,SHA-1 也已被证实不具备强扛碰撞性。

为了提高安全性,NIST还设计出了SHA-224、SHA-256、SHA-384 和 SHA-512算法(SHA-2),跟SHA-1算法原理类似。

SHA-3 相关算法也已经被提出。

现在还是有很多系统采用的 MD5 和 SHA-1 算法,但是这些算法已经不安全了,一般现在推荐至少使用SHA-256或更安全的算法。

2. 性能、安全和建议

Hash 算法一般都是计算敏感型的,也意味着计算资源是瓶颈,主频越高的 CPU 运行 Hash 算法速度越快。因此可以通过硬件加速来提升 Hash 计算的吞吐量。

也有一些 Hash 算法不是计算敏感型的。例如 scrypt 算法,计算过程需要大量内存资源,这样的Hash算法经常用来避免算力攻击的常景。

Hash 算法不是一种加密算法,不能用于对信息的保护,但是 Hash 算法常用于对口令的保存上。例如:用户登录网站需要通过用户名口令来验证。如果网站后台数据库直接保存用户口令的明文,一旦数据库发生泄漏后果不堪设想。利用 Hash 的特性,后台可以仅保存密码的 Hash 值,这样只要比对 Hash 值一致,则说明输入的口令正确,即使数据库泄露了,也无法从 Hash 值还原口令,只能进行穷举测试。

由于用户设置的口令的强度不够,只是简单字符串,例如上面我们说的 password、123456、654321 或者生日等。有人通过这些口令,计算对应的 Hash 值,制作对应的哈希值库,这样通过Hash值可以快速反查原始口令。

为了防范这一类攻击,我们建议不要用简单的口令及个人生日作为口令,现今个人身份信息很容易得到,以上是个人建议。

如果是网站或者说是系统,可以采用在口令基础上添加随机数后进行 Hash 且随机数存放在不同的地方,这样只要不是两者同事泄露,攻击者就很难破解。

下一章:SHA-256 算法原理

SHA256 是 SHA-2 下细分出的一种算法,SHA-2下又可再分为六个不同的算法标准。包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这 ...