一、哈希算法
哈希算法是一种将任意长度的输入数据转换为固定长度哈希值的算法。哈希值通常是一个固定长度的字节序列,表示输入数据的唯一摘要或指纹。哈希算法的主要特点是快速计算、不可逆和抗碰撞。
哈希算法主要用于数据完整性校验、数字签名、密码存储和唯一标识等领域。它们可以帮助检测数据是否被篡改,并提供一种简单而有效的数据摘要方法。然而,需要注意的是,哈希算法是不可逆的,即无法从哈希值还原出原始数据。
二、哈希算法之MD5
全称 MD5 消息摘要算法,又称哈希算法、散列算法,用于将任意长度的输入数据转换为固定长度的128位(16字节)哈希值。由美国密码学家罗纳德·李维斯特设计,于 1992 年作为 RFC 1321 被公布,用以取代 MD4 算法。摘要算法是单向加密的,也就是说明文通过摘要算法加密之后,是不能解密的。摘要算法的第二个特点密文是固定长度的,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。之所以叫摘要算法,它的算法就是提取明文重要的特征。所以,两个不同的明文,使用了摘要算法之后,有可能他们的密文是一样的,不过这个概率非常的低。
MD5算法的工作原理如下:
- 将输入数据分割为512位(64字节)的块。
- 对每个块进行一系列的位操作和非线性函数运算,包括按位异或、与、或以及循环左移等操作。
- 对每个块进行四轮循环运算,每轮循环使用一个特定的非线性函数。
- 最后,将经过四轮循环运算后的结果进行连接,得到最终的128位哈希值。
MD5算法具有以下特点: - 安全性:MD5算法已经被证明不安全,容易受到碰撞攻击,即找到两个不同的输入数据产生相同的MD5哈希值。
- 哈希长度:MD5生成128位(16字节)的哈希值。
- 速度:MD5算法计算速度较快,适用于简单的数据完整性校验和非安全性场景。
- 应用:MD5算法常用于校验文件完整性、密码存储等领域,但不适合用于安全性要求较高的场景。
MD5算法的特点是快速计算和生成固定长度的哈希值。它被广泛用于校验文件完整性、密码存储和数据摘要等应用。然而,由于MD5算法存在一些安全性问题,如碰撞攻击,使得它不再适用于安全性要求较高的场景。碰撞攻击是指找到两个不同的输入数据,它们经过MD5算法计算后得到相同的哈希值,这可能导致安全漏洞。
因此,在需要更高安全性的应用中,推荐使用更强的哈希算法,如SHA-256等。
- JavaScript 实现,一般在扣代码时用于解密
const cryptoJS = require('crypto-js')
const message = 'hello word';
console.log(cryptoJS.MD5(message).toString())
- Python 实现
import hashlib
message = 'hello word'.encode('utf-8')
md5 = hashlib.md5(message)
md5.update('hello'.encode('utf-8'))
print('十六进制哈希值:',md5.hexdigest())
三、哈希算法之SHA
SHA是一系列密码学哈希函数的缩写,用于将任意长度的输入数据转换为固定长度的哈希值。SHA算法由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。主要适用于数字签名标准里面定义的数字签名算法,SHA 通常指 SHA 家族的五个算法,分别是 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512,其中SHA-256是最常用的版本之一,SHA 是比 MD5 更安全一点的摘要算法,MD5 的密文是 32 位,而 SHA-1 是 40 位,版本越强,密文越长,代价是速度越慢。
SHA-256算法的工作原理如下:
- 将输入数据分割为512位(64字节)的块。
- 对每个块进行一系列的位操作和非线性函数运算,包括按位异或、与、或以及循环左移等操作。
- 对每个块进行64轮循环运算,每轮循环使用一个特定的非线性函数。
- 最后,将经过64轮循环运算后的结果进行连接,得到256位的哈希值。
SHA算法具有以下特点: - 安全性:SHA算法提供了较高的安全性,能够抵抗常见的攻击,如碰撞攻击和预映像攻击。
- 哈希长度:不同版本的SHA算法产生不同长度的哈希值,如SHA-256生成256位哈希值,SHA-512生成512位哈希值。
- 速度:SHA算法在大多数情况下具有较快的计算速度,适用于大规模数据处理。
- 应用:SHA算法被广泛应用于数字签名、数据完整性校验、密码存储等领域。
需要注意的是,随着计算技术的发展,某些较旧的SHA算法(如SHA-1)已经被认为不安全,因此在选择使用SHA算法时应优先考虑较新且更安全的版本,如SHA-256。
- JavaScript 实现,一般在扣代码时用于解密
const cryptoJS = require('crypto-js')
const message = 'hello word';
const wordArray = cryptoJS.x64.WordArray.create();
wordArray.init(message)
console.log(cryptoJS.SHA512(message).toString())
console.log(cryptoJS.SHA512(wordArray).toString())
- Python 实现
import hashlib
message = 'hello word'.encode('utf-8')
md5 = hashlib.sha256(message)
md5.update('hello'.encode('utf-8'))
print('十六进制哈希值:',md5.hexdigest())
四、哈希算法之HMAC
全称散列消息认证码、密钥相关的哈希运算消息认证码,于 1996 年提出,1997 年作为 RFC 2104 被公布,HMAC 加密算法是一种安全的基于加密 Hash 函数和共享密钥的消息认证协议,它要求通信双方共享密钥 key、约定算法、对报文进行 Hash 运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性,HMAC算法可以防止数据被篡改和伪造。
HMAC算法的工作原理如下:
- 输入消息和密钥。
- 将密钥进行预处理,以适应不同的哈希函数要求。
- 对预处理后的密钥和消息进行哈希计算。
- 将哈希计算的结果与密钥进行再次处理。
- 最终生成的结果即为HMAC值。
HMAC算法的特点包括: - 安全性:HMAC算法提供了较高的安全性,能够抵抗常见的攻击,如碰撞攻击和预映像攻击。
- 可验证性:接收方可以使用相同的密钥和HMAC算法对接收到的消息进行计算,并与发送方提供的HMAC值进行比较,以验证消息的完整性和认证发送者。
- 可变性:通过更改密钥,可以生成不同的HMAC值,从而增加了消息认证的灵活性。
- 应用:HMAC算法常用于网络通信、数据完整性校验和身份认证等领域,结合哈希函数(如SHA-256)使用,以提供更高的安全性和可靠性。
HMAC算法常用于网络通信、数据完整性校验和身份认证等领域。在实际应用中,常用的哈希函数如SHA-256、SHA-512等与HMAC算法结合使用,以提供更高的安全性和可靠性。
- JavaScript 实现,一般在扣代码时用于解密
const cryptoJS = require('crypto-js')
const message = 'hello word';
const key = "ThisIsTheSecretKey";
const wordArray = cryptoJS.x64.WordArray.create();
wordArray.init(message)
console.log(cryptoJS.HmacMD5(message,key).toString())
- Python 实现
import hmac
key = b'my_secret_key'
message = b'Hello, world!'
hmac_md5 = hmac.new(key, message, digestmod='md5')
hmac_md5.update('hello'.encode('utf-8'))
print('十六进制哈希值:',hmac_md5.hexdigest())