前言

上一篇文章讲了如何使用 OpenSSL 进行 MD5 计算,今天来说一说 SHA 的使用。

SHA

SHA(Secure Hash Algorithm,安全散列算法)是一系列由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布的密码散列函数。SHA算法族包括了多个版本,如SHA-0、SHA-1、SHA-2和SHA-3,每个版本都有其特定的输出长度和内部结构

SHA-0

这是最初的设计,但由于被发现存在安全弱点,在实际应用中几乎未被使用。长度为160位。

SHA-1

作为SHA-0的改进版发布,曾经广泛应用于各种安全协议中。长度也是160位。

随着时间的发展,研究者发现了SHA-1的安全缺陷,特别是容易受到碰撞攻击的影响。因此,它已不再被视为安全的选择。

SHA-2

SHA-2是SHA-1的后继者,提供了更高级别的安全性。SHA-2不是一个单独的算法,而是一组算法,通常以它们的输出长度来区分,比如SHA-256、SHA-384等。

相比SHA-1,SHA-2具有更大的内部状态空间和更复杂的运算逻辑,从而提高了抵抗碰撞攻击的能力。

SHA3

SHA-3并不是SHA-2的直接升级,而是在Keccak哈希函数的基础上发展而来的新一代标准。它被选为FIPS认可的标准之一,旨在提供一个不同于SHA-2的替代方案,以防万一SHA-2出现安全漏洞。

SHA-3同样支持不同的输出长度,例如SHA3-224、SHA3-256、SHA3-384和SHA3-512。

SHA-3采用了截然不同的设计原理——海绵构造(sponge construction),这使得它在某些应用场景下可能比SHA-2更适合或更高效。

上代码

SHA1

SHA1 已经不怎么用了,直接上代码

1
2
3
4
5
6
7
8
string data = "测试数据";
unsigned char out[20] = {0};

SHA1(reinterpret_cast<const unsigned char*>(data.data()), data.size(), out);

for (int i = 0; i < 20; ++i) {
    cout << hex << (int)out[i];
}
1
f11be67999c8cfbc7db7233e1b964bb4423bcb45

SHA256

1
2
3
4
5
6
7
string data = "测试数据";
unsigned char out[32] = {0};
SHA256(reinterpret_cast<const unsigned char *>(data.data()), data.size(), out);

for (int i = 0; i < 32; ++i) {
    cout << hex << (int)out[i];
}
1
d4abe3226384bef0676bf9ac11b5a71f3b5bc3aad95c6373e5e64ebcce136cb6

总结

SHA 算法的使用和 MD5 是一样的,只有名字上的区别,但是 MD5 已经被攻破了,所以不安全,实际使用尽可能使用 SHA2 算法。