企业微信的回调服务验证身份
问题
- 为什么这样验证就解决了身份验证问题
- 为什么这样做就验证就能解决内容是否被篡改的问题
问题1:思考过程
- 在大多数人的日常生活中是否有类似的生活场景?显然是没有的,那么我们就不能通过现实举例这个思路的想明白
- 我们平时用的验证身份的方法是什么?是账号密码,重点是密码,通过对比数据库中存储的密码来校验身份是否正确
- 而很明显,考虑到密码在网络中传递的被截获可能,这里没有采用简单的传输密码
- 我们发现我们真实的需要是检验双方的密码一致,与传输密码给对方没有必然关联,可以传其他东西证明。
- 传消息A和消息B,然后使用密码来关联它们,判断是否关联的上来确认检验身份。类似于两个人都有钥匙,常规的是大家拿出钥匙来对比也是否一样,而现在改为人员A拿出一个锁来(自己钥匙能开的)给到人员B,人员B通过自己手中钥匙是否能开这个锁来判断这个人的身份。因为只有拥有钥匙的人才知道钥匙能开什么锁。
- 那么会不会有人根据这个锁来逆向出钥匙呢?确实是可以的。但是如果这个锁,单纯的打开还不能确定对方身份呢?如果这把锁打开了,会在锁上面显示一行数字,只有人员A和B才知道正确的数字是多少。而且其它人打开了看到了锁上面的数字,但是因为不知道正确的数字而无法确定自己逆向出来的钥匙是否正确。而如果锁上面是6位数,那么是否就要根据锁逆向伪造出2的6次方种钥匙呢?而且还不能确定是哪一把钥匙才是正确的呢?
- 就如同上面企业微信的消息内容根据'计算公式'和token计算出密钥一样,'计算公式'就是这个'锁的数字'
- 那么好了,有些人就会说企业微信的校验签名的工具是一样的,相当于大家都是知道'锁的数字'的,只要尝试的足够多的密钥也是可以破解出来的。
- 但是你有没有想过,这个锁可能是有陷阱。比方说:消息内容根据'计算公式'和token计算出正确签名,有没有可能,相同的'消息内容'和相同的'计算公式'有好几个不同的token都是可以计算得出正确的签名的?据我所知有这样的算法的
- 就相当于有好几把钥匙也可能可以打开这把锁,然后且得出正确得'数字'!可问题是你不确定这个钥匙是否正确,那么下一次新过来的锁,就未必能打开了!还是无法确定正确的钥匙。
- 有没发现破解并非不可能,而是难度!别忘了首先你要破解https!
- 这里的本质就是通过增加逆向推导正确token过程中可能遇到的错误token数量,来把正确token隐藏在千万亿个错误token中,给破解者增加破解成本。
至此第一个问题解决!
问题2:思考过程
- 消息内容(1) + 计算公式(2) + 正确token(7) = 签名(10)
- 四则运算 1+2+7=10
- (?)+2+7=(?)
- 显然。如果填对了就是没有被篡改,填错了就是被篡改了。
- token的机制已经一定程度保证了token的安全性,不是2+7那么简单的。