安全规范
## 签名算法
#### 签名生成的步骤如下:
([附录:签名校验工具](https://easydoc.xyz/#/doc/35916721/TsmR7gA2/ZTWQDFRl))
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
>d ◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步:在stringA最后拼接上&key=appSecret得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ appSecret请联系商务获取
举例:
```java
假设传送的参数如下:
appId: 12345678
nonceStr: b7c0ebd06e66454b867e73d8400ff882
timestamp: 1554366469041
signType: MD5
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下
stringA="appId=12345678&nonceStr=b7c0ebd06e66454b867e73d8400ff882&signType=MD5×tamp=1554366469041";
第二步:拼接appSecret
stringSignTemp=stringA+"&key=abcdef" // key的值为appSecret
sign=MD5(stringSignTemp).toUpperCase()="8AED3DCC696D89D628AA62719A66FBED" // MD5签名方式
sign=SHA1(stringSignTemp).toUpperCase()="6DF9CBB3D636644C7ADF60269321A3E61B4A0C6F" // SHA1签名方式
sign=SHA256(stringSignTemp).toUpperCase()="097E3C9C1114308A8EE6F25BBAA9518BDB55CD45CEC839702EAD8E8A383A6E76" // SHA256签名方式
```
## 生成随机数算法
API接口协议中包含字段nonceStr,主要保证签名不可预测。推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。