加签验签说明
报文加验签说明
报文签名说明
数据签名 数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
要求对整段报文做签名值,然后赋值给sign(签名值)字段
签名时只对data一个字段进行签名
签名方式
使用的签名算法为SHA256withRSA,返回报文先验签再反序列化为对象
签名报文组装
将请求报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串,然后进行签名,并且赋值给sign。
返回报文验签
根据各个语言通用的rsa签名算法,使用商户的私钥对上面组的签名报文签名得到sign,添加到请求json的报文中。
拼接需要签名的数据示例:
/**
-
排序拼接需要签名/验签的数据
-
@param data
-
@return
*/
public static String getReqStr(JSONObject data){
Set keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
// 参数值为空,则不参与签名
if (data.get(k) != null) {
sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
}
}
return sb.toString().substring(0,sb.toString().lastIndexOf("&"));
}/**
- @param data 待签名字符串
- @param privateKey 私钥
- @throws Exception /
- 私钥签名
- @return String
*/
public static String sign(String data, String privateKey) throws Exception {
byte[] keyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateK);
signature.update(data.getBytes());
byte[] result = signature.sign();
return org.apache.commons.codec.binary.Base64.encodeBase64String(result);
}
报文验签说明
数据签名 数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
验签时只对data一个字段进行签名
验签方式
使用的签名算法为SHA256withRSA,!!返回报文先验签再反序列化为对象,避免对象因为属性少失败!!
取出服务器签名值
返回报文中的sign字段(base64加密的)
验签报文组装
将返回报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串,。【见上述示例】
返回报文验签
根据各个语言通用的rsa验签算法,根据服务器掩码值,组的验签报文,使用易生机构公钥进行SHA256withRSA验签
/**
* 排序拼接需要签名/验签的数据
* @param data
* @return
*/
public static String getReqStr(JSONObject data){
Set<String> keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
// 参数值为空,则不参与签名
if (data.get(k) != null) {
sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
}
}
return sb.toString().substring(0,sb.toString().lastIndexOf("&"));
}
/**
*
* @description: 公钥验签
* @param data 已签名数据
* @param publicKey 公钥
* @param sign 签名
* @return boolean
*/
public static boolean verify(String data, String publicKey, String sign) throws Exception {
Signature signature = Signature.getInstance("SHA256WithRSA");
PublicKey key = KeyFactory.getInstance("RSA")
.generatePublic(new X509EncodedKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(publicKey)));
signature.initVerify(key);
signature.update(data.getBytes());
return signature.verify(Base64.decodeBase64(sign));
}
加签私钥 商户私钥(同分账、收银台):
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOSxfpYzsR5pKg0lpDb8rwhmJuaN06l+o9wf5FvKFoGCGt0yMmv/OUqsiFzuatZ7VV2hx/WavOVVubMr6YXD8/GINStC/6Hj7ih30XDjQLM1TRmBfhux+FO3LEYUULKbp/LZz+tXDU6QN6Hvw3CGNRhwdAV5Sq1d0REg7tbPuCZpAgMBAAECgYBigmpqvN2AogAxJZO08+dZkNcU3ObdzeU7fqlZOJW1N5vmyCacCpZdKjCbB0ASH5JIANYnX34as3CIU1QGAMBk63Rm7LYF7mPu3r+qYUhwt60FTynxktkKgvtr2slDNc+oF4noAKvzd3W752RWn/lp9rGvhkk8gljaBVa0A+4A+QJBAP6R2b7dDdmICLJFJV8EdKJjThndSQymS4MLT2p3ZdT2ULhMtLjbOy0FeQaBFEkF6cy8TquIvO76qwlNCPlO5qcCQQDl+mz7s7Pd6SaMcuAMPDnuCNqVZNspseP3WmnB3q/Bt3Ad+dTtoopVYgvrIAb+VxVkZ804k3c192wl9BilVTxvAkEA4I4jdztjRim7EhXwezpg8AWNFT+femsOXRATA6VCzHJijdAL8qxgLLyRH22pSSjQLetFsgYyMtQnH1M2wUQaLQJBAKNDNa02NKF8C+a3AoENHF70oCBgegnOhLSr1dpQuVr/W7OcEWIl+qiEs0tW8EANGF2wJwtb/Mwt+vOypvBwYzcCQQCff7Cv+JHXx+voggV+lJqkBpFGjIV2axQ97n4JrBxwok7y42KEhMrKqVRAzXp7iGSxXfq7AkL0JSU7gSz+dg/3
加密/解签 易生机构公钥(同分账、收银台):
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAqRw0nZ1rGTpAeKupP7coS+en6BveJL4aFVt9men4Zzkpuv/IeK6YJ2yk4m8ppZ7TLW4t5WsPEhYOnUfMtjhW4nuQfjgU54juJ1KMHYiX9gaaO+z80ZnaiKD2YsZMFiE9dlTeBlkRL5xXbHa+JonHfVKXMr13oI8oZNKdpnvknQIDAQAB
敏感信息加密说明
加密方法
敏感信息加密解密:
1、 发起方自行产生对称密钥(32位);
2、发起方使用对称密钥, 按照AES256_ECB算法对敏感信息加密;
3、发起方使用接收方加密证书的公钥,用对方密钥等相关信息加密和Base64编码,生成数字信封并存入报文的“dgtlEnvlp数字信封”。
4、接收方对数字信封解密,获取对称密钥等明文信息。
5、接收方使用对称密钥, 对敏感信息进行解密。
加密/解签 公钥:
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAqRw0nZ1rGTpAeKupP7coS+en6BveJL4aFVt9men4Zzkpuv/IeK6YJ2yk4m8ppZ7TLW4t5WsPEhYOnUfMtjhW4nuQfjgU54juJ1KMHYiX9gaaO+z80ZnaiKD2YsZMFiE9dlTeBlkRL5xXbHa+JonHfVKXMr13oI8oZNKdpnvknQIDAQAB"