SHA-256
SHA-2是广泛应用的哈希函数,并且有不同的版本,这篇博客主要介绍SHA-256。
SHA-256算法满足了哈希函数的三个安全属性:
- 抗第一原像性 - 无法根据哈希函数的输出恢复其对应的输入。
- 抗第二原像性 - 给定一个输入和它的哈希值,无法找到一个不同于该输入的新输入,使得这两个输入产生一样的哈希值。
- 抗碰撞性 - 这个性质保证不能够产生哈希值相同的两个不同的输入。
SHA-2是一种采用Merkle–Damgård结构来构造的哈希函数。
密码学学习笔记(十三):哈希函数 - Merkle–Damgård结构_kingofyb的博客-CSDN博客
首先,我们对需要进行哈希运算的输入做填充,然后将填充后的输入划分为等长的分组,每个分组的长度等于压缩函数的输入长度。SHA-256算法输入的分组大小为512比特。
然后,将压缩函数应用于消息的所有分组,在每次迭代过程中,都将上一轮的输出作为压缩函数的第二个输入参数,而将消息的某个分组作为它的第一个输入参数。将压缩函数最终的输出作为消息的摘要。
在第一次调用压缩函数时,它的第二个参数通常是固定的,且标准文件中将其指定为特定的值。具体来说,SHA-256使用第一个素数的平方根来生成这个初始值。
MAC
什么是MAC消息认证码?
密码学学习笔记(三):MAC - 消息认证码_mac消息认证码_kingofyb的博客-CSDN博客
HMAC(Hash-based MAC)
RFC 2104: HMAC: Keyed-Hashing for Message Authentication (rfc-editor.org)
由于长度扩展攻击,SHA-2不能被直接用来计算秘密消息的哈希值。HMAC可以将哈希函数转换为密钥算法。
- 由主密钥生成两个密钥:k1 = k ⊕ ipad,k2 = k ⊕ opad。其中,ipad(内部填充)以及opad(外部填充)是常量,⊕表示异或操作。
- 将密钥k1和message串联在一起,计算串联结果的哈希值。
- 将密钥k2与第2步的输出串联在一起后,再次计算串联结果的哈希值。
- 将第3步输出的哈希值作为最终的认证标签。
HMAC的好处在于,其设计者可以证明嵌入的散列函数的强度与HMAC的强度之间的联系。如果嵌入的散列函数的安全受到威胁,只需要用更安全的散列函数替换嵌入的散列函数,这样仍可以保持HMAC的安全性。
H = 嵌入的散列函数比如SHA。
M = HMAC的消息输入,包括嵌入到散列函数中定义的填充位。
Yi = M的第i个分组, 0≤i≤L-1。
L = M中的分组数。
b = 每一分组中所含的位数。
n = 嵌入的散列函数所产生的散列码长度
K = 秘密密钥。如果密钥的长度大于b,则将密钥作为散列函数的输入来产生一个n位数的密钥。建议密钥长度≥n。
K+ = 为使K为b位长而在K左边填充0后所得的结果。
ipad = 00110110(十六进制36)重复b/8次。
opad = 01011100(十六进制5C)重复b/8次。
HMAC(K,M) = H[(K+ ⊕ opad) || H[(K+ ⊕ ipad) || M]]
NMAC(Nested MAC)
NMAC算法(Nested MAC)类似于之前描述的CBC-MAC算法。它使用稍微不同的伪随机函数F。函数F返回的数字是密钥的正确值。CBC-MAC可以看我之前的博客。
密码学学习笔记(三):MAC - 消息认证码_mac消息认证码_kingofyb的博客-CSDN博客
与CBC-MAC的一样,在对最后的数据块进行加密之后,使用第二秘密加密密钥对结果进行一次附加加密。由于最后一个数据块的先前加密结果由与密钥相同数量的比特组成,因此应附加额外的比特序列,以确保结果与数据块具有相同的大小。NMAC通常用于数据块长度远大于密钥大小的系统。
如果没有算法的最后一步(没有使用第二个密钥进行加密),入侵者将能够使用正确计算的身份验证码将任意数量的块附加到拦截的消息中。然后,他可以计算一个新的身份验证码,并将其附加到修改后的消息中。作为第一个新添加的函数F的输入,攻击者将使用原始消息的原始身份验证代码。
KMAC(KECCAK MAC)
KMAC使用SHA-3-256(key||message)。KMAC算法使用了CSHAKE来构造消息认证码算法,其中cSHAKE是SHAKE可扩展输出函数的自定义版本。KMAC算法对密钥、输入以及输出的长度进行编码,并将其作为cSHAKE的输入。