它要求调用方按照约定好的算法生成签名字符串,作为请求的一部分,接口提供方验算签名即可知是否合法。 将所有业务请求参数按字母先后顺序排序 参数名称和参数值链接成一个字符串 A 在字符串 A 的首尾加上 appsecret 组成一个新字符串 B 对字符串进行 md5 得到签名 sign 假设请求的参数为 :f=1,b=23,k=33,排序后为 b =23,f=1,k=33,参数名和参数值链接后为 b23f1k33,首尾加上 appsecret 后 md5: md5(secretkey1value1key2value2 这里使用了 md5 的算法进行签名,也可以自行选择其他签名方式,例如 RSA,SHA 等。 请求唯一性保证: md5 签名方法可以保证来源及请求参数的合法性,但是请求链接一旦泄露,可以反复请求,对于某些拉取数据的接口来说并不是一件好事,相当于是泄露了数据。
API签名设计 可变性 每次的签名必须是不一样的。 时效性 每次请求的时效,过期作废等。 唯一性 每次的签名是唯一的。 完整性 能够对传入数据进行验证,防止篡改。 rsa_public_key.pem #生成公钥 OpenSSL> exit #退出OpenSSL程序 #rsa_public_key.pem 和 rsa_private_key.pem 即为所需 下面给出一套RSA和md5的整合签名代码给予参考 $data['key'] = $this->md5Key; $this->message(['code' => 200, 'msg' => '签名成功 self::RSA2: $this->message(['code' => 200, 'msg' => '签名成功!' array($ip, $long) : array('0.0.0.0', 0); return $ip[$type]; } } //MD5签名 //以用户提交抢购商品为例 $data
上次《前后端API交互如何保证数据安全性?》文章中,我们介绍了如何在Spring Boot框架中去统一处理数据的加解密。 第一种方式 参数中加签名,前后端约定一个key,将参数按照字母排序拼接成一个字符串,然后拼接上key,最后用MD5或者SHA进行加密,最后得到一个加密的签名,作为参数传到后端进行验证。 比如: name=yinjihuan&sign=MD5(name=yinjihuan+key) 后端我们可以统一在过滤器中进行验证,取得参数sign的值,取得请求的所有参数,同时也按照前端生成sign的方式生成一个新的 第二种方式 第二种方式比较简单,因为我们前面讲过了请求的数据加解密,既然我们有了加密的key和加密算法,其实完全可以将签名的内容用我们的加密算法进行加密,上面用的md5方式不是很安全,md5是可以被破解的 此时到后台的数据就是参数信息+签名时间,比如:{name:"yjh",signTime:19210212121212}, 签名就是{name:"yjh",signTime:19210212121212}
总结一下常见的 签名生成规则 规则1 每个 HTTP 请求中均需要携带以下的 HTTP 标头字段(HTTP Request Header) 默认名称 带 RC-前缀 类型 说明 App-Key RC-App-Key 您需要参考下文的签名计算方法生成该字段的值 签名计算方法 将以下三个字符串按顺序(App Secret + Nonce + Timestamp)拼接成一个字符串,进行 SHA1 哈希计算。 Nonce:随机数 Timestamp:时间戳 以下是计算数据签名的 PHP 代码示例: // 重置随机数种子。 $timestamp); 规则2 $appkey='abc';//双方约定的key,不参与http请求,只用于计算签名 $sign=112233;//请求带的签名 $params=[ 'timestamp =$value; } //生成签名 $sign2=md5($str);
前言 大部分情况下,我们使用已有的API签名方案(如腾讯云API签名、阿里云APi签名、亚马逊API签名等等)即可,无需从零开始设计一个API签名方案。 写这篇文章的主要目的,是希望通过思考如何去设计一个可用API签名的过程,更好地理解现有的各种大同小异的签名方案背后的设计原理,从而更好地保护好我们的API接口。 当然,有需要自己设计一个签名方案的场景也可参考一下。 1、API签名是什么 API签名可以理解为就是对API的调用进行签名保护。 由此可见,API签名的真正目的是:通过明确调用者的身份,以便控制API的访问权限,从而保护数据的安全性。 1)校验时间有效性Timestamp (2)校验Nonce唯一性 (3)提取SecretId和签名信息 (4)根据SecretId提取用户密钥SecretKey,用于生产签名 (5)拼接签名内容,生成签名
q=yapi-plugin-pl 关于平台的使用,可以参考官方文档,本篇文章针对使用Yapi做API测试时,期望对每条请求增加特定算法的签名参数(header或者body中),尤其是实时签名,提供了特别好的解决方案 https://hellosean1025.github.io/yapi/documents/project.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83 官方文档中关于这里的说明可以总结为 https://hellosean1025.github.io/yapi/documents/project.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83 1、还是官方文档的说明 2.1 签名串生成工具 生成签名串 https://console.cloud.tencent.com/api/explorer? ”打印出的过程参数,我们采取写死的方式,作为Yapi脚本签名算法的输入,期望是Yapi得出的签名串和“签名串生成工具”签名值一样。
二、MD5参数签名 参看《MD5防止数据被篡改的做法》 我们对api查询产品接口进行优化 1.给app分配对应的key、secret 2.sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下 crong=3 排序为,arong=1, crong=3,mrong=2 然后将参数名和参数值进行拼接得到参数字符串,arong1crong3mrong2 (2)将secret加在参数字符串的头部后进行MD5加密 即得到签名sign 新api接口代码如下 ? 这种方法请求多了key和sign参数,请求的时候就需要合法的key和正确签名sign才可以获取群组数据。这样就解决了身份验证和防止参数篡改问题。 上述的sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,在实际使用中可以根据需求采用其他签名算法,比如:RSA,SHA等。 相关阅读 《一个海量在线用户即时通讯系统(IM)的完整设计》 《MD5防止数据被篡改的做法》
最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。 更多技术干货请关注公众号【Java技术精选】 实现 请求接口:http://api.test.com/test? sign=MD5(stringSignTemp).toUpperCase(); 最终请求 http://api.test.com/test? =world&work=java×tamp=now&nonce=nonce&sign=sign; 服务端 Token&AppKey(APP) 在APP开放API Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证
最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。 实现 请求接口:http://api.test.com/test? sign=MD5(stringSignTemp).toUpperCase(); 最终请求http://api.test.com/test? Token&AppKey(APP) 在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的 Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证
我们在设计签名验证的时候,请注意要满足以下几点: 可变性:每次的签名必须是不一样的。 时效性:每次请求的时效,过期作废等。 唯一性:每次的签名是唯一的。 第4步: 计算第3步字符串的md5值(32位),然后转成大写,得到的字符串作为sign的值。 举例: 假设传输的数据是/interface.php? 注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。 unset($data['sign']); ksort($data); $params = http_build_query($data); // $secret是通过key在api 的数据库中查询得到 $sign2 = md5($params .
最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。 实现 请求接口:http://api.test.com/test? sign=MD5(stringSignTemp).toUpperCase(); 最终请求http://api.test.com/test? Token&AppKey(APP) 在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的 Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证
最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。 实现 请求接口:http://api.test.com/test? sign=MD5(stringSignTemp).toUpperCase(); 最终请求http://api.test.com/test? Token&AppKey(APP) 在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的 Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证
前面我们提供了php和.net调用快递鸟API接口的示例,部分网友也使用python开发,因此我封装了相关代码,让大家少踩坑。 quote(data).replace("%20%", "%") return reqData def data_sign(shipperCode, logisticCode): """签名 return reqData APIKey = "554343b2-7252-439b-b4eb-1af42c8f2175"; # 请求内容(未编码) + APIKey # MD5加密前去除空格 data = json.dumps(frs_reqData).replace(": ", ":").replace(", ", ",") + APIKey # md5加密 sign_md5 = hashlib.md5(data.encode("utf-8")).hexdigest() # Base64编码 data_sign = base64.b64encode(sign_md5
在stringA最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。 实现 请求接口:http://api.test.com/test? sign=MD5(stringSignTemp).toUpperCase(); 最终请求http://api.test.com/test? name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign; 服务端 # Token&AppKey(APP) 在APP开放API Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证
120995917 防止数据抓包窃取 风险简述 RSA 非对称加密 案例 设置URL有效时长 前端代码 后端验证时间戳 测试不传时间戳 确保URL唯一性 修改前端请求参数 后端增加验证RequestId 增加签名 username; form.password = password; $.ajax({ url: "http://localhost:9000/api requestId=" + getUuid(); encrypt.encrypt(param); const url = "http://localhost:9000/api TimeUnit.MINUTES); return requestId; } 增加签名 最后一步,添加签名 前端增加签名 跟前端约定好,json数据按照ASCII升序排序。 data + requestId + timestamp); $.ajax({ url: "http://localhost:9000/api/user/login
1自签名SSL证书的创建 创建自签名SSL工具xca为:https://sourceforge.net/projects/xca/ 创建过程 1)创建根证书 打开软件,界面如下。 给文件命名,选择文件存储的位置,这里我放在了E:\CA这个文件夹下 点击保存,弹出下页,填写密码 点击ok,弹出下页 点击 ,弹出下页 签名算法改为SHA 256,其他不变,点击 ,然后点击ok,弹出下页 4 访问自签名Https网站 一般添加安全例外就可以,但是有些会显示不全,解决办法是: 例如火狐浏览器中,点击暂时解除保护。
接口对接常见的问题基本上是数据签名错误导致的接口联调失败,大家在电商平台调用快递鸟接口时,为了提供对接效率,给大家提供一些方法供大家参考。 OrderCode\":\"\",\"ShipperCode\":\"SF\",\"LogisticCode\":\"118461988807\"}" ; //把(jsonStr+APIKey)进行MD5加密 string md5Str=MD5(jsonStr + apiKey, charset); //把md5Str 进行Base64编码 string base64Str=base64(md5Str,charset ///<param name="charset">编码方式</param> ///<returns>密文</returns> private string MD5(string str, check; check = new System.Security.Cryptography.MD5CryptoServiceProvider();
但它暂时没办法安装依赖或者导入腾讯云官方SDK,在调用腾讯云API时的签名会比较麻烦。 解决办法 用JS纯手写一个API 3.0的签名函数使用 目录 给出写好的签名代码 讲解使用方法 拿获取轻量应用服务器可用区列表举例,演示如何使用(需要Demo修改的可以直接跳到这) 一、签名代码 相关的边缘函数 参考对应的API文档,注意不包含公共参数 headersPending:API请求头,参考对应的 API文档,包含公共参数 签名函数输出: 输出包含签名的请求头headers,使用该请求头直接调用API ""; const Service = ""; // 填写API的调用地址 const apiurl = ''; // 签名前的请求头,填写API调用地址的Host、 ,会输出包含签名的请求头,后续直接用这个请求头请求API const headers = await qcloud_v3_post(SecretId,SecretKey,Service,bodyString
使用Php开发语言调用接口,常见的问题基本上是数据签名错误导致的接口联调失败,大家在电商平台调用快递鸟接口时,为了提供对接效率,给大家提供一些复制直接用的方法。 ('AppKey', '请到快递鸟官网申请http://kdniao.com/reg'); //请求url defined('ReqURL') or define('ReqURL', 'http://api.kdniao.com { $gets.= fread($fd, 128); } fclose($fd); return $gets; } /** * 电商Sign签名生成 * @param data 内容 * @param appkey Appkey * @return DataSign签名 */ function encrypt($data, $appkey ) { return urlencode(base64_encode(md5($data,$appkey))); }
HTML5 的 performance timing API 统计了一个浏览器窗口从卸载当前页面开始到加载完毕目标页面的整个流程中,每个节点的时间戳 通过这些节点的时间戳,我们可以计算出很多有用的信息