安全规范
<h3>签名算法</h3>
<p>为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,开放平台服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。</p>
<p>1)将所有系统参数及业务参数(其中sign参数除外)按照参数名的字典顺序排序</p>
<p>2)将参数以参数1值1参数2值2...的顺序拼接,例如a=&c=3&b=1,变为b1c3,参数使用utf-8编码</p>
<p>3)按照secret + 排序后的参数的顺序进行连接,得到加密前的字符串</p>
<p>4)对加密前的字符串进行sha1加密并转为小写字符串,得到签名</p>
<p>5)将得到的签名赋给sign作为请求的参数</p>
<p>假设请求参数如下</p>
<p>secret: test</p>
<p>系统参数:</p>
<p>appkey=test</p>
<p>timestamp=1477395862</p>
<p>version=1.0</p>
<p>应用参数:</p>
<p>number=123</p>
<p>string=测试</p>
<p>double=123.123</p>
<p>boolean=true</p>
<p>empty=</p>
<p>加密前的字符串为</p>
<p>testappkeytestbooleantruedouble123.123number123string测试timestamp1477395862version1.0</p>
<p>sha1计算所得sign为</p>
<p>8943ba698f4b009f80dc2fd69ff9b313381263bd</p>
<p><strong>以java举例,签名算法代码如下</strong></p>
<pre><code>// 所有参数按参数名排序
Set&lt;String&gt; keySet = paramMap.keySet();
List&lt;String&gt; keyList = new ArrayList&lt;&gt;(keySet);
Collections.sort(keyList);
// 加密前字符串拼接
StringBuilder signStr = new StringBuilder();
for (String key : keyList) {
if (key.equals( &quot;sign&quot; )) {
continue ;
}
Object value = paramMap.get(key);
if (value == null || (value.getClass().isArray() &amp;&amp; byte . class .isAssignableFrom(value.getClass().getComponentType()))) {
continue ;
}
String valueString = value.toString();
if (StringUtils.isEmpty(valueString)) {
continue ;
}
signStr.append(key).append(value);
}
// 计算SHA1签名
String sign = SHA1Util.Sha1( &quot;test&quot; + signStr.toString()).toLowerCase();
</code></pre>
<p><strong>以PHP举例,签名算法代码如下</strong></p>
<pre><code> function makeSign($param)
{
$appkey = &quot;test_appkey_val&quot;;
$appSecret = &quot;test_app_secret_val&quot;;
$version = &quot;1.0&quot;;
$timestamp = time();
$tmpArr = array(
&quot;appkey&quot; =&gt; $appkey,
&quot;timestamp&quot; =&gt; $timestamp,
&quot;version&quot; =&gt; $version,
);
foreach ($param as $k =&gt; $v) {
$tmpArr[$k] = $v;
}
ksort($tmpArr);
$str = $appSecret;
foreach ($tmpArr as $k =&gt; $v) {
if ($v === false) $v = 'false';
if ($v === true) $v = 'true';
if (empty($v) &amp;&amp; $v != 0) continue;
$str .= $k . $v;
}
return strtolower(sha1($str));
}
</code></pre>