访问网址,填入验证码1234
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
查看数据包
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
直接修改验证码,发现验签了
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
从js代码中分析一下签名如何生成查看jwt关键字即可发现此处js代码
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
在上面居然要一划拉就看到了加密算法
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
下断点确实走这边,后发现iss是固定的
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
所以猜测验签的值主要是r前面是固定的。
//未进行base64加密
t={"typ":"JWT","alg":"SHA256"}
e={"verifyCode":"1233","iss":"ac85123b-59e2-4673-82e0-c64663e41696","issType":"web","appType":"web"}
|
我们输入的1234验证码放在e变量里现在需要来研究r变量如何生成可以看出来r是使用HmacSHA256算法处理t+.+n
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
加密的key为
kIK0E3eP8GzOGoHrErZQ1BNmMCAwEAAQ==abc |
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
也可以追进去看。getDkeyFromS()函数
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
点到M即可发现
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
这里y函数用了一个从浏览器本身取值的
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
去浏览器缓存看看,值也是一样的
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
可以是进行加密。
这里有一个小点...因为得到的r类型是object,直接用sha256+base64处理数据对不上
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
需要经过一轮from->hex,才可以。。并且key的格式为utf-8。这个我没找到代码出处是试出来的
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
和结果对比。获得也是正确的
![js前端解密-HMACSHA256加密算法 js前端解密-HMACSHA256加密算法]()
原文始发于微信公众号(NightTalk安全团队):js前端解密-HMACSHA256加密算法
评论