哈希算法加盐
传统的哈希算法:
digest = hash(input)
因为相同的输入会产生相同的输出,所以想要加盐,加盐的目的就在于,使输入有所变化:
digest = hash(salt + input)
这个salt可以看作是一个额外的“认证码”,同样的输入,不同的认证码,会产生不同的输出。因此,要验证哈希值,必须同时提供“认证码”。
HMAC算法
HMAC以某种哈希算法为部件
HMAC算法是一种基于密钥的消息认证码算法,全称是Hash-based Message Authentication Code
HMAC算法的输入是消息和密钥,中间会使用到某种哈希算法,输出是MAC值
HMAC算法需要某种哈希算法作为部件,即下图中的“单向散列函数”
HMAC相当于,基于密钥,给哈希算法“加了盐”
HMAC的应用
HMAC-SHA256算法
参考:https://fileem.com/getting-started-from-zero-hmac-sha256
HMAC-SHA256算法,是使用了SHA-256的HMAC算法。
依据HMAC和SHA-256,HMAC-SHA256算法的明文分组长度B为512-bit,密钥K长度任意(最小推荐长度为256-bit,一般应大于512-bit),输出的摘要值为256-bit。
HMAC-SHA256步骤
HMAC-SHA256算法加密步骤如下图所示:
①. 密钥填充。若密钥比SHA-256算法的分组长度B(512-bit)短,则需在末尾填充0,直到其长度达到单向散列函数的分组长度为止。若密钥比分组长度长,则要用SHA-256算法求出密钥的散列值,然后将这个散列值作为新的密钥;
②. 内部填充。将填充后的密钥与被称为ipad的序列进行异或运算,所形成的值为ipadkey。ipad是将00110110这一序列不断循环反复直到达到分组长度;
③. 与消息组合。将ipadkey与消息组合,也就是将ipadkey附加在消息的开头。
④. 计算散列值。将3的结果输入SHA-256函数,并计算出散列值。
⑤. 外部填充。将填充后的密钥与被称为opad的序列进行异或运算,所形成的值为opadkey。opad是将01011100这一序列不断循环反复直到达到分组长度。
⑥. 与散列值组合。将4的散列值拼在opadkey后面。
⑦. 计算散列值。将6的结果输入SHA-256函数,并计算出散列值,这个散列值就是最终的摘要内容。