签名方法
企税通会对每个访问请求进行身份验证,即每个请求都需要在请求头中包含签名信息(Signature)以验证请求者身份。 签名信息由安全凭证生成,安全凭证包括 SecretId 和 SecretKey;新建用户后会生成两组安全凭证,一组用于测试,另一组用于正式环境。
1. 生成签名串
有了安全凭证 SecretId 和 SecretKey 后,就可以生成签名串了。以下是生成签名串的详细过程: 假设用户的 SecretId 和 SecretKey 分别是:
- SecretId:
4qEz52MOCvJO*******
- SecretKey:
g5Zq0Ebo6lmYeJcwDHZt1*******
danger
SecretId
、SecretKey
用于接口调用鉴权,请务必注意保密,不可在公开文档或代码中以明文展示,否则可能导致账号被盗用。
1.1 生成签名串方式
将公共参数 SecretId、SecretKey、Timestamp拼接,拼接格式 secretId+secretKey+timestamp
,将拼接完的字符串使用 SHA256Hex 得到最终的签名串。
示例:
curl --location --recognizeBankCardRequest POST 'http://127.0.0.1:8080/test' \
--header 'timestamp: 1651671975016' \
--header 'secretId: YWhkYndkamtod2prZHdk' \
--header 'signature: 33fa3a54d83021a105e23bbb0b9ebcbda8af7560ea0bcdf2089186244cdc6e1b' \
--header 'Content-Type: application/json' \
--data-raw '{"ip":"127.0.0.1"}'
2. JAVA 生成签名串
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Signature {
public static String sign(String secretId, String secretKey, String timestamp) {
String plainText = secretId + secretKey + timestamp;
byte[] bytes = plainText.getBytes(Charset.forName("utf-8"));
MessageDigest messageDigest;
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(bytes);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage(), e);
}
byte[] digest = messageDigest.digest();
return bytesToHexString(digest);
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xFF);
if (temp.length() == 1) {
builder.append("0");
}
builder.append(temp);
}
return builder.toString();
}
}