支付宝AES如何加密

继之前给大家介绍了 V3 加密解密的方法之后,今天给大家介绍下支付宝的 AES 加密。

注意: 以下说明均在使用支付宝 SDK 集成的基础上,未使用支付宝 SDK 的小伙伴要使用的话老老实实从 AES 加密原理开始研究吧。


什么是AES密钥

AES 是一种高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是目前对称密钥加密中比较通用的一种加密方式,该加密方式加密/解密的密钥即为 AES 密钥。


什么情况会用到AES加密

在支付宝接口对接中,强制要求使用的 AES 加密的场景并不多,主要是用在前后端敏感信息(如身份证、手机号等)传输的时候,对敏感信息进行加密传输

非敏感信息传输场景下也可以使用 AES 加密方式对请求数据进行加密传输,以保证接口内容在传输过程中的安全性。

不过支付宝的 AES 加密仅仅是对 bizContent 的请求内容进行加密,如果你请求的接口没有 bizContent 的话,那就没有办法加密了,强行加密只会报错 [当前API不支持加密请求]。


AES密钥如何加密

AES 密钥在使用过程中主要分为 加密 和 解密 两个部分,下面我们就来一一说明下这如何实现。


如何配置 AES 密钥

在加密和解密之前,最重要的一步就是先配置 AES 密钥。

支付宝在每个应用下都提供了 AES 密钥的配置入口。

配置路径: 支付宝开放平台 -> 对应应用详情 -> 开发设置 -> 接口内容加密方式:

通过短信/密码验证之后,就可以获取到这一串 AES 密钥了:


如何加密

支付宝的 SDK 提供了加密的封装方法,只要在初始化的方法中传入 AES 密钥,并且在代码中加入 request.setNeedEncrypt(true) 就可以,下面以 alipay.trade.pay 接口为例:

public class AlipayTradePay {

    public static void main(String[] args) throws AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2","AES密钥值","AES");
        AlipayTradePayRequest request = new AlipayTradePayRequest();

        JSONObject Content = new JSONObject() ;
        Content.put("out_trade_no", "20200612000001");
        Content.put("subject", "subject");
        Content.put("total_amount", "0.01");
        Content.put("scene", "bar_code");
        Content.put("auth_code", "28763443825664394");
        Content.put("product_code", "FACE_TO_FACE_PAYMENT");

        // 封装请求参数到biz_content
        request.setBizContent(Content.toString());
        
        //将biz_content的内容进行加密
        request.setNeedEncrypt(true);
        
        AlipayTradePayResponse response = alipayClient.execute(request);

        /** 获取接口调用结果 **/
        System.out.println(response.getBody());
    }

}

👉 其他语言的加密方式可以参考:[如何使用AES密钥加密]


如何解密

解密分为两种场景:

  • 一种对应上述的加密方式,即使用内容加密方式请求到支付宝后,支付宝返回的数据也是加密的方式,需要对支付宝返回的同步响应数据进行解密
  • 另一种是请求时没有使用内容加密的方式,但支付宝自动对敏感数据进行加密了,需要解密后才能获取到实际的信息,常见于小程序获取手机号等

返回数据样例:

{
  "response":"m6HvyxulfAnFhlizJoh0sWzUubfBUlXIIJMJtBqIAaCQrbUeHdzI0V3Fh13kvWGRrOajf+Cy6ZQr6jhTFmy/DbXkMLDhDtMPx7oQc96bo73k9XsRuraDRgYm9zMGdU8H7zueR1QO4ZqrHhHm2CoiaNa13X83W2bXmqmu6wKLdXNQUsob64D/IFRMRyluPr9wwXBrVu0WzlT4UsGLxfD7rIvtODkYotD0Nxx3IzCM/Ujb2pAkaRwmq2RqTrbywa+5Y0GBSk9ajeHTqkmq1cTIxPdxzT+IgEjTm3s+ZJRhLXcPCGI0UYOgEOtnGVZ6bwmAxLq2gydmdGIQeJ5TOsnr6W4o4ySTrF03218jbBjKOLPCc8MrTHFiWr9MWSE7fkVXq7tszDXupLAs65IKaRbpO2PJD9GXt7w6TnPfaKRERDrtwteNo9iiu8zNCRWYTPGXxXz0gtN5aQZX6XPGCLCA7LqIxQ=",
  "sign":"d9MdAHH4Hug+6CAM0cIVmQgLRQBjq4jeq64ma3BCNuy6Ctpmonn2GYY1Y+aUJr2m8YpfArGtKn6rGVWsvubDH9jEnLj/2D2/Ma8Vfvnl7T+thrBX4J334tmaUMrJZAjiRirHbMpBfUWsnyFuy0EJaYBrC3o7YXDIM7abQFMLnZNe2ByeYEcnrjcYBBWT/kEXwisjy5fm8MDedp0ZSG7YDMbEdNp5M1YTzuSYB0MlmNg7OwHVgZYiR/eEhCvsa3GM91aQa400Lvr1sFiAXRebaC5ufatswnF3szdsiNtgbsF13Vr2sqm0gj82dqATU0XvcbXRlRWInB0XGT7PP7sWBg=="
}

对于这两种方式的解密方法都是一样的(下列代码中包含验签步骤):

//小程序前端提交的返回信息
String response = "{"response":"O9WWS91PFVrzBjBCVvYAtLAGqckg28xGgNw1465AuET2zakde6CmploNMH5hiDZctVC/EB2BU409KwQIll3wVRU2hvLhM77THJP9oiarmeqf36lZ9eBJYtCttYn06MCm","sign":"WK0SL/BJcm0NF7bjPtLIbbtlU84iM9X6w/guIFN6ba3yPBtEMjPU81hn2n+qU6ftSJv27Ew4C+Hfrbv/VDe7yzzi7MGxD16nTjNHzmz7FHSET3N71IsqZJoGeu/828vvBMwqTt6zR4m7dig6InAHvuQDeQVg1MA4QiOwUx8sSaBP6uz5rXZVb/n5AlSzaVEWJF1WmJr/fdxkJosgKzHVYUas+8w86eDo4bVMZK6nCn54ON9tt27Gk63jcMmp2FOr/swItfhwkUWSIOYiS/XkQZ3gaPaO1rTSfc7TymTdpJ72YFja5OIaJ5qeG/Hh0glohtyl4ce2cibnAS3omn1Buw=="}";

//1. 获取验签和解密所需要的参数
//参数转换成json格式
JSONObject jsonObject = JSON.parseObject(response);
//获取json里面的值key(可以省略)
String sign=jsonObject.getString("sign");
String content=jsonObject.getString("response");
String signType = "RSA2";
String charset = "UTF-8";
String encryptType = "AES";

//判断是否为加密内容
boolean isDataEncrypted = !content.startsWith("{");
boolean signCheckPass = false;
//2. 验签
String signContent = content;
String signVeriKey = "你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)";
String decryptKey = "你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)";
//如果是加密的报文则需要在密文的前后添加双引号
if (isDataEncrypted) {    
    signContent = """ + signContent + """;
}
try {
    signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
} catch (AlipayApiException e) {
        //验签异常, 日志
}
if(!signCheckPass) {
        //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)    
    throw new Exception("验签失败");
}
//3. 解密
String plainData = null;
if (isDataEncrypted) {    
    try {
                plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
                System.out.println("解密信息plainData:"+plainData);
    } catch (AlipayApiException e) {        
        //解密异常, 记录日志       
       throw new Exception("解密异常");    
    }
} else {    
    plainData = content;
        System.out.println("plainData:"+plainData);
}

👉 其他语言的解密方法参考:[如何使用AES密钥解密]


可能会遇到的问题

下面列举一些大家在使用 AES 密钥过程中可能会遇到的问题:


以上就是关于支付宝 AES 内容加密的所有内容啦,希望对你有所帮助

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容