安全规范

  • 为了保证数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验,以验证数据报文的真实性及有效性,防止报文被人为篡改。
  • 签名生成规则:上送报文体中,报文数据data即为签名原文,将其使用约定的签名算法计算得到签名。目前仅支持RSA2签名方式,签名时需使用汇付提供的商户私钥进行签名。
  • 得到签名后,需要将其放入报文体的sign字段中一起上送,以供服务端进行签名验证。
  • 同样汇付返回的报文商户也需要使用汇付的公钥进行验签。
  • 以下为JAVA版本的加签验签方法,在报文调用实例章节,我们提供了三个语言版本的调用Demo(Java、PHP、PYTHON),您可以 前往 下载源代码:
/**
 * RSA私钥签名:签名方式SHA1withRSA
 * @param data 待签名字符串
 * @param privateKeyBase64 私钥(Base64编码)
 * @return 签名byte[]
 * @throws Exception
 */
public static String sign(String data, String privateKeyBase64) {
        // Base64 --> Key
        try {
                byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
                KeyFactory keyFactory;
                keyFactory = KeyFactory.getInstance("RSA");
                PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
                // Sign
                Signature signature = Signature.getInstance("SHA256WithRSA");
                signature.initSign(privateKey);
                signature.update(data.getBytes("UTF-8"));
                return Base64.getEncoder().encodeToString(signature.sign());
        } catch (Exception e) {
                return null;
        }
}

/**
 * RSA公钥验签
 * @param data 待签名字符串
 * @param publicKeyBase64 公钥(Base64编码)
 * @return 验签结果
 * @throws Exception
 */
public static boolean verify(String data, String publicKeyBase64, String sign) {
   // Base64 --> Key
   try {
          byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
          X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
          KeyFactory keyFactory;
          keyFactory = KeyFactory.getInstance("RSA");
          PublicKey publicKey = keyFactory.generatePublic(keySpec);
          // verify
          Signature signature = Signature.getInstance("SHA256WithRSA");
          signature.initVerify(publicKey);
          signature.update(data.getBytes("UTF-8"));
          return signature.verify(Base64.getDecoder().decode(sign));
   } catch (Exception e) {
          logger.error("Exception", e);
          return false;
   }

}