签名机制
签名方式
签名内容产生规则:
1. 获取请求完整JSON报文,使用MD5计算出报文摘要值(全小写);
2. 将该摘要值按照指定的签名算法使用交易发送方的签名私钥进行签名,将签名值使用Base64转码得到签名串signature。
3. 将签名方式和签名值设置在http header中,并自定义如下对应属性:
自定义Header key | 必须 | 描述 |
---|---|---|
Signature-Type | 是 | 签名方式:RSA |
Signature-Data | 是 | 签名值RSA签名,见安全签名机制 Signature-Data = Base64(RSA(MD5(完整JSON报文))) |
timestamp | 是 | 时间戳(yyyyMMddHHmmss) 例如20211110145022 |
nonce | 是 | 随机字符串,至少为10位,有效期内防重复提交 |
institution_id | 是 | 机构ID |
签名规则
时间戳的目的就是为了减轻DOS攻击。防止请求被拦截后一直尝试请求接口。服务器端设置时间戳
阀值,如果服务器时间减请求时间戳超过阀值,表示签名超时,接口调用失败。
随机值nonce主要是为了增加签名sign的多变性,也可以保护接口的的幂等性,相邻的两次请求
nonce不允许重复,如果重复则认为是重复提交,接口调用失败。
特殊字段加密
报文Signature-Type | 签名算法 | 加密算法 |
---|---|---|
RSA | MD5withRSA | RSA |
1. 获取请求待加密字段明文;
2. 将明文使用交易发送方的RSA公钥进行加密,将加密值使用Base64转码得到密文,ciphertext-Data = Base64(RSA(plaintext))。
基于RSA算法
注:openSSL工具与参考代码,请与运维联系获取。
RSA密钥生成地址可参考:https://www.toolhelper.cn/AsymmetricEncryption/RSA
签名验签
String plainText = "这是一条待签名文本";
System.out.println("明文:" + plainText);
String sign = SignatureUtil.getInstance().sign(CommercialTenant.getPrivatekey(), plainText);
System.out.println("签名:" + sign);
boolean verify = SignatureUtil.getInstance().checksign(CommercialTenant.getPublickey(), plainText, sign);
System.out.println("验签结果:" + verify);
加密解密
String text = "这是一条待加密 明文";
System.out.println("明文:" + text);
String encodeText = RSAUtil.getInstance().encrypt(text, CommercialTenant.getPublickey());
System.out.println("密文:" + encodeText);
String decodeText = RSAUtil.getInstance().decrypt(encodeText, CommercialTenant.getPrivatekey());
System.out.println("解密后明文:" + decodeText);
修改于 2024-05-21 02:56:30