028-86261949

当前位置:首页 > 技术交流 > 接口安全之数据签名

接口安全之数据签名

2018/11/19 14:31 分类: 技术交流 浏览:48

在接口开发中,为了保证请求数据的安全性,防止数据被篡改,我们通常需要对请求参数进行加密。 
这里讲解一下使用数字签名进行安全加密的方式。


1.接口协议
接口协议中通常会提供一个 appKey作为客户端的唯一标识,appSecret作为接入密钥。
假设appKey=1001,appSecret=as5dghwe3hjf8dfkw9
接口地址为:http://www.itsource.cn/api/login
请求参数 :
appKey 客户端标识 
username 用户名 
password 密码 
time Unix时间戳
sign 数字签名


2.加密处理
签名算法过程:
1.对除签名外的所有请求参数按key做升序排列 (假设当前时间的时间戳是12345678)
例如:有c=3,b=2,a=1 三个参,另加上时间戳后, 按key排序后为:a=1,b=2,c=3,timestamp=12345678。
2.把参数名和参数值连接成字符串,得到拼装字符:
a1b2c3timestamp12345678
3.用密钥连接到接拼装字符串尾部,然后进行32位MD5加密,最后将到得MD5加密摘要转化成大写。
相应php代码如下:

  1. <?php
  2. $appKey=1001;
  3. $appSecret = 'as5dghwe3hjf8dfkw9';
  4. $username = '张三';
  5. $password = '123456';
  6. $time = time();
  7.  
  8. $requestData = [
  9.     'appKey'=>$appKey,
  10.     'username'=>$username,
  11.     'password'=>$password,
  12.     'time'=>time(),
  13. ];
  14. ksort($requestData);
  15. $str = '';
  16. foreach ($requestData as $key=>$value){
  17.     $str.= $key.$value;
  18. }
  19. $str .= $appSecret;
  20. $sign = strtoupper(md5($str));//得到数字签名
复制代码

得到签名后将签名添加到请求参数后面,这样请求接口:
http://www.itsource.cn/api/login?appKey=1001&appSecret=as5dghwe3hjf8dfkw9&username=张三&password=123456&time=1241234567&sign=E10ADC3949BA59ABBE56E057F20F883E


3.验证数字签名
接口服务端通过相同的加密方式验证数字签名
验证数字签名的php代码如下

  1. <?php
  2. class ApiController{
  3.     public function login()
  4.     {
  5.         $appSecret = 'as5dghwe3hjf8dfkw9';
  6.         $requestData = $_GET;
  7.         $sign = $requestData['sign'];
  8.         unset($requestData['sign']);
  9.         $str = '';
  10.         foreach ($requestData as $key=>$value){
  11.             $str.= $key.$value;
  12.         }
  13.         $str .= $appSecret;
  14.         $mySign = strtoupper(md5($str));//得到数字签名
  15.         if($mySign != $sign){
  16.             //签名验证失败
  17.         }else{
  18.             //签名验证成功
  19.         }
  20.     }
  21. }

    感谢源码时代教学讲师提供此文章!

    本文为原创文章,转载请注明出处!

#标签:接口安全,数据