注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6511991367751696900/
在进行微信认证开发的时候,官网文档有这样一段话
当时就想为什么这么多参数,都是什么意思?网上有现成的代码,抄下来就可以运行了
可这个疑问一直在心里,百度查询了很多篇文章去解释我这个疑惑,现在就转换成个人的理解记录下来
个人服务器对于访问它的人,不能确定是谁?可能是自己的用户也可能是不明身份的人,这种情况一般会使用账户来判断,如果账户密码没有问题,那么就是自己的用户不是不明身份的人了。
本来是一个皆大欢喜的局面,但是账号密码开始的时候是明文,明文就是:账户是123: 密码是:456,在网络传输的时候,就是123、456的传输,但是中途可能被人解惑了,被别人知道了
针对这种情况,就需要进行账户密码加密了,加密有很多种
随机数+时间戳是非常常见的一种,它的原理是什么呢?
随机数nonce是由服务器提供,在用户请求服务的时候,服务商提供给用户,用户用这个随机数+账户密码按照一定规则(MD5、SHA1)加密处理为一个新的字符
712312389791(随机数)、123(账户)、456(密码)、MD5(规则)
生成:(712312389791 + 123 + 456) + MD5 = 1238979asdqw123
将生成的结果、用户名和随机数发送回服务商
(1238979asdqw123 + 123 + 712312389791) -> 服务商
注意此时是没有密码的,也就是说密码没有在中间传输,那么别人截取后也是看不懂1238979asdqw123这个是什么,但是服务器可以看懂,服务器如何看懂呢?
服务器是有用户的密码的,也就是456,那么服务器拿到(1238979asdqw123 + 123 + 712312389791)加上密码就可以生成:(712312389791 + 123 + 456) + MD5 = 1238979asdqw123(服务器生成)
此时服务器用1238979asdqw123(服务器生成)和用户发过来的1238979asdqw123对比,发现这就是我的用户就可以提供服务了,对应到微信服务器认证就是:
那么另外两个参数呢?
因为随机数是服务商发给用户的,当用户将随机数返回后
服务器会验证随机数是否是我曾经发出的,那么就需要将随机数存在服务器端,试想一下,如果用户非常多,每次生成一个随机数,总有可能会生成一个相同的随机数,一个随机数就会对应两个用户,针对这个情况,就加一个时间戳,这个时间戳只和当前时间有关系。
那么服务器第一次给用户的有随机数+时间戳
那么最后一个参数就是返回给微信服务器,告诉它返回成功了,因为你如果随便返回一个内容,微信服务器不认识你,比如返回一个“你好”,所以微信服务器给你什么,你就返回什么,就可以了。
这个不用怕被截取,因为目的是个人服务器是否认识微信服务器,而不是微信服务器认识个人服务器。
就是让你信任微信服务器,不是让微信服务器信任你