API 签名(Signature)
为保障数据传输的安全性,每个接口请求均需在 Header 中包含以下鉴权字段:
- X-APP-ID: 应用唯一标识
- X-NONCE: 随机字符串
- X-TIMESTAMP: 当前时间戳
- X-SIGN: 动态签名。由
appId、nonce、timestamp及body(若有)按 ASCII 升序排列拼接,并在此基础上于末尾追加key参数进行MD5加密所得。- 有 body 格式:
appId={appId}&body={body}&nonce={nonce}×tamp={timestamp}&key={key} - 无 body 格式:
appId={appId}&nonce={nonce}×tamp={timestamp}&key={key}
- 有 body 格式:
1. 准备工作
在开始生成签名之前,请确保您已获取以下凭证:
- appId: 应用唯一标识。
- key: 用于签名的私钥(请妥善保管,切勿泄露)。
- 获取路径: 登录 cueip.com, 进入 “系统管理 / API 密钥” 菜单。若无权限,请联系客服开通。
2. 签名参数说明
生成签名需要以下四个核心参数:
| 参数名 | 类型 | 描述 | 示例 |
|---|---|---|---|
appId | String | 您的应用 ID | 10001 |
key | String | 您的 API 密钥 | abc1234567890 |
nonce | Number | 随机数(建议使用随机整数或 UUID),增加请求唯一性 | 847291 |
timestamp | Number | 当前 Unix 时间戳(秒或毫秒,需与服务器时间同步) | 1713164000 |
3. 生成步骤
第一步:拼接字符串
将参数按照固定的顺序(字典序或指定顺序)拼接为待签名字符串。
注意: 必须严格遵守以下格式,不得包含空格:
appId={appId}&body={body}&nonce={nonce}×tamp={timestamp}&key={key}
第二步:MD5 加密
对上述生成的字符串进行 MD5 加密。
4. 代码示例
Java
java
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
public class SignatureDemo {
/**
* 生成签名方法
* @param appId 应用ID
* @param key API密钥
* @param nonce 随机数
* @param timestamp 时间戳
* @return MD5签名字符串
*/
public static String generateSignature(String appId, String nonce, String timestamp, String key) {
// 1. 按照规则拼接字符串
// 格式: appId=*&nonce=*×tamp=*&key=*
String rawString = String.format("appId=%s&nonce=%s×tamp=%s&key=%s",
appId, nonce, timestamp, key);
return md5(rawString);
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 provider not found", e);
}
}
public static void main(String[] args) {
String appId = "*";
String key = "*";
String nonce = "*";
String timestamp = "*";
String sign = generateSignature(appId, nonce, timestamp, key);
System.out.println("生成的签名: " + sign);
}
}5. 安全提示
- 密钥保护:
key仅应存在于服务端,严禁直接在前端(浏览器、App 直接暴露)进行签名逻辑,以免密钥被截获。 - 时效校验: 服务端通常会校验
timestamp,如果请求时间与服务器时间偏差过大(如超过 5 分钟),请求将被拒绝。
