支付宝小程序或H5方案密钥加密说明

本文适用于持牌金融客户KYC留存用户认证凭证合规需求。当客户通过支付宝隐私办资质审核且功能配置完成后,可参考本文生成RSA公钥加密后的AES密钥,以便在查询认证结果时获取加密的相关图片。

适用产品方案

加密流程

  1. 首先您需要使用AES算法对16位字符串(随机生成)进行加密,然后对加密后的字符串进行Base64编码。

  2. 参考以下代码示例使用RSA公钥对Base64编码的AES密钥进行加密,即可获取到业务参数。

    获取到加密后的参数后,在查询实人认证结果时,可传入encToken参数中,用于获取加密的相关图片。

    import com.alibaba.fastjson.JSON;
    import org.apache.commons.codec.binary.Base64;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import sun.misc.BASE64Decoder;
    
    import javax.crypto.Cipher;
    import java.security.KeyFactory;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    
    public class RSAUtils {
        private static final Logger LOGGER = LoggerFactory.getLogger(RSAUtils.class);
        private static final String CHARSET = "UTF-8";
        /**
         *非对称加密密钥算法
         */
        private static final String RSA = "RSA";
        /**
         *密填充方式
         */
        private static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding"; 
         /**
          *获取加密图片RSA公钥
          */
        private static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxav0oL0tJJf1KxiM1rDBChK/ANM7yWkA/sjhZwfZRjPpbGuMLN2HDtfyyYKtj5jg8AggarvofiVmC0omyWiiZUeZ+z9pjH+SxgFbrf6rHPNNkg7Q6S8WgBUOMK+nyus3u2U7YkxJgk/qtGNM72VP8x2TJgGavZfxH1rfFdf041qVGxSSZBgtU+ic5TX31XbIeKCd+BBy+AZiBTnqE19rbSfqNebHRAQzOfwUBiMbvmnQ4FagH6cqLPyH+NMQm5fWHPkCdgNgf8sp+5Du7kgmUkLljxz2Zqg3fQlYSrCjSrmQs2brIuoMTeC91wWNjxyS56vcLRAjMUZsIGqPNHlScwIDAQAB";
    
        public static String encrypt(String paramData) {
            try {
                byte[] paramDataBytes = paramData.getBytes(CHARSET);
                byte[] publicKeyDecode = Base64.decodeBase64(PUBLIC_KEY);
                byte[] rsaCryptoBytes = encryptByPublicKey(paramDataBytes, publicKeyDecode);
                return Base64.encodeBase64String(rsaCryptoBytes);
            } catch (Exception e) {
                LOGGER.info(JSON.toJSONString(e));
            }
            return null;
        }
    
        /**
         * 用公钥对字符串进行加密
         * @param data 原文
         * @param publicKey 公钥
         */
        private static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
            // 得到公钥
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
            KeyFactory kf = KeyFactory.getInstance(RSA);
            PublicKey keyPublic = kf.generatePublic(keySpec);
            // 加密数据
            Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
            cp.init(Cipher.ENCRYPT_MODE, keyPublic);
            return cp.doFinal(data);
        }
    }