在使用HTTP/SOAP协议传输数据时,签名作为其中一个参数,作用如下:
- 鉴权:客户端和服务端的密钥匹配;
- 防数据篡改:参数及密钥生成加密字符串,将该字符串作为签名,任意一个参数改变,签名校验就会失败。
一句话描述:客户端与服务端以同样的规则生成密钥,最终比较2个密钥是否相等,若相等,则证明密钥验证成功。
1、鉴权
一个普通的URL:http://127.0.0.1:8000/api/?a=1&b=2
未加密的签名(明文) | 已加密的签名(加密算法MD5进行加密) | |
签名 | @admin123 | 4b9db269c5f978e1264480b0a7619eea |
URL | http://127.0.0.1:8000/api/?a=1&b=2&sign=@admin123 | http://127.0.0.1:8000/api/?a=1&b=2&sign=4b9db269c5f978e1264480b0a7619eea |
MD5 加密过程:
PS:由于MD5算法是不可逆的,所以,当服务器接收到参数后,同样需要对@admin123进行MD5加密,然后,与接口传来的sign加密字符串比较是否相等,从而鉴别是否有权访问接口。
2、防数据篡改
一个普通的URL:http://127.0.0.1:8000/api/?a=1&b=2
未加密的签名(明文) | 已加密的签名(加密算法MD5进行加密) | |
签名 | a=1&b=2&@admin123 | 4b9db269c5f978e1264480b0a7619eea |
URL | http://127.0.0.1:8000/api/?a=1&b=2&sign=@admin123 | http://127.0.0.1:8000/api/?a=1&b=2&sign=80a0c2d8e01e4022cac3474b6127b1b9 |
md5加密过程:
3、弊端
由于MD5加密是不可逆的,所以服务端的必须知道客户端接口的参数和值,否则签名验证就会失败。
但一般在接口设计的时候,对客户端的参数并不完全已知,例如:新增用户的手机号,类似这种情况时,就不能使用全参加密。