使用 OpenSSL 进行 SHA 计算
Contents
前言
上一篇文章讲了如何使用 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 已经不怎么用了,直接上代码
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];
}
f11be67999c8cfbc7db7233e1b964bb4423bcb45
SHA256
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];
}
d4abe3226384bef0676bf9ac11b5a71f3b5bc3aad95c6373e5e64ebcce136cb6
总结
SHA 算法的使用和 MD5 是一样的,只有名字上的区别,但是 MD5 已经被攻破了,所以不安全,实际使用尽可能使用 SHA2 算法。