最近在做一些蓝牙相关的开发,其中遇到了加密协议,之前没接触过这块,sha256,AES这些东西只知道名字,也没想到有一天会用到。眼看着10月即将过去,给自己定的一个月一篇水文的目标都快要达不到了,实在惭愧。趁着10月的尾巴,奉上这篇写给前端的密码学知识。
hex
摘要算法
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示),常用的有MD5, SHA1, SHA256,SHA512等。这种算法可以用来验证文件的有效性,比如某个文件下载下来是不是完整的,另外一种场景是,将用户密码存储到数据库中的时候,不存明文,而是存储密码的hash值
加盐
由于黑客可以通过反查内容和hash之间对应的表,来破解我们的密码,所以有了加盐的方式来提高安全性。比如用户的密码是123456,MD5得到的hash是e10adc3949ba59abbe56e057f20f883e,我们在计算hash时,可以在密码后拼接salt, 把密码变成123456salt,然后再计算并存到数据库里面,这样,即使黑客拿到了hash,也无法轻易通过反查表的方式得到密码。
HMAC
我们在调用一些API的时候,需要验证签名,可能会遇到使用HMAC-SHA256方式来验证签名,那么这个 HMAC-SHA256 和 SHA256 是一个东西吗,这两者有联系,但是其实不是一个东西。我们来看一个图:
我们可以看到HMAC算法里面的入参有两个,一个secretKey,一个message,最后输出一个MAC(message auth code)
HMAC的加密实现:HMAC (key, message) = H ( (key XOR opad ) + H( (key XOR ipad ) + message ) )
其中:
opad 是外部填充常数(0x5c5c5c…5c5c,一段十六进制常量)
ipad 是内部填充常数(0x363636…3636,一段十六进制常量)
我们可以看到,HMAC是使用了我们前面提到的摘要算法的,其中key相当于之前提到的盐,但是HMAC通过算法让这个过程更安全。
有了HMAC,平台侧可以把secret key发放给授权用户,用户调用api时,通过这个key,使用指定 的HMAC算法对内容加密,并把内容和sign一起给平台进行校验,如果平台算出的sign和请求带的sign一致,则返回正确的结果,否则就报错。这个过程就是验签。