必须知道MD5是不可逆性
在讲解MD5签名原理之前,必须明白MD5是不可逆的,也就是不可破解的,当然可能稍有了解的人会说MD5可以破解,当然,网上也有一些强大的数据库会把各种数据组合的MD5收集起来形成强大的数据库,能冠军数据库搜索可能一些简单的数据会马上找出某些组合对应的MD5值,但咱说的MD5签名生成是最少32位的数值MD5加密,所以这个破解的可能性是非常非常非常小的。所以这还是比较安全的。
原理
原理很简单,请求方对请求数据按一定的规则排序,加上appkey码一起通过MD5加密生成签名,然后把请求数据和签名发给服务方,服务方拿到数据后,去掉appid和无用的数据,通过appid找到请求方的appkey,然后按同样的规则处理数据,并加上appkey通过MD5加密也生成签名,然后和请求方生成的签名去对比,如果值一样,签名验证通过。
需要的东西
服务商一般会给你一个appid,appkey;同时这两个参数服务商也会保存,这两个形成了你的唯一标识。
appid通过网络传输,而appkey是不在网络上进行传输的,只在生成签名时使用,所以安全性还是比较高的。
MD5生成签名的流程
1. 除去加密数组中的空值和签名参数
2. 对数组排序
3. 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
4. 加上appkey值,对形成的数据进行MD5加密,生成签名
下面是各步聚的PHP代码
1. 除去加密数组中的空值和签名参数
最详细的MD5签名的原理和流程
2. 对数组排序
最详细的MD5签名的原理和流程
3.把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
最详细的MD5签名的原理和流程
4.加上appkey值,对形成的数据进行MD5加密,生成签名
最详细的MD5签名的原理和流程
看实例更清晰
比如我要拿下面数据去服务方接口请求:
最详细的MD5签名的原理和流程
-
第一步会把请求数组中的空值,或者没必要的参数都去掉,得到了下面的数据,这才是真正的需要的灵数据。
最详细的MD5签名的原理和流程 -
然后对数组进行排序,得到下面的结果。
最详细的MD5签名的原理和流程 -
然后对数组进行拼接,得到下在结果
最详细的MD5签名的原理和流程 -
然后加上appkey生成最终的签名。
最详细的MD5签名的原理和流程 -
最后在原始数据后面加上生成的签名,就是最终要传给用户的数据,红圈里的是最后加上的签名。
最详细的MD5签名的原理和流程 - 客户收到数据后会拿数据去按上面方法处理,最后把生成的签名值,和你的$data['sign']进行比较,如果值一样,签名通过。