支付宝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密钥会自动过期吗]
- [如何更新AES密钥]
- [java提示:Invalid AES key length: 1218 bytes]
- [AES加密与RSA加签的顺序]
- [isv.decryption-error-unknown (解密出错, 未知错误)]
- [isv.decryption-error-missing-encrypt-type(解密出错, 未指定加密算法)]
以上就是关于支付宝 AES 内容加密的所有内容啦,希望对你有所帮助
支付宝AES如何加密的更多相关文章
- PHP AES的加密解密
AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- aes rsa加密
aes在加密时,若加密字符串的长度不是16,则会在后面加0x00补足16位,所以在解密后还应该去除0x00 小于16字节的原文会得到16字节长度的密文,小于32字节的原文会得到32字节长度的密文,大于 ...
- AES对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
- 【Python】Python AES 对称加密示例
代码: import sys from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex AES_SECRET_KEY = ...
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- JAVA实现AES的加密和解密算法
原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...
- C#与Java互通AES算法加密解密
/// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...
- AES高级加密标准简析
1 AES高级加密标准简介 1.1 概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区 ...
- AES对称加密
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...
随机推荐
- Litctf2024-郑州轻工业大学第二届ctf-校内赛道wp
战队:怎落笔都不对 最终成绩校内第4 MISC 1. 盯帧珍珠 打开文件发现是一个图片,放入 010 查看得文件头是 gif 格式 改为gif后缀得到一个GIF图,在下面这个网站分解,即可得到flag ...
- Scrum 和我主张的管理方式的同与异
虽然零零星星接触过scrum的一些知识,之前并没有深入了解过.这次机缘巧合,将 Jeff Sutherland 的<用一半的时间做两倍的事>拜读完毕,感觉 scrum 的做法其实很多和我自 ...
- 龙哥量化:期货软件中红红绿绿的"多开,空开,空平,多平,多换,空换,双开,双平,换手"是什么意思?(转载的)
期货投资者在看盘时,会看到红红绿绿的"多开,空开,空平,多平,多换,空换,双开,双平,换手",以快期专业版为例,如下图1所示: 图1.红绿开平数据(快期专业版) 这些数据里面的红色 ...
- Qt音视频开发26-监控画面各种图形绘制设计
一.前言 视频监控系统做到后面,逐渐需要搭配人工智能算法,将算法计算后的信息以OSD标签以及方框各种图形的信息显示到视频中,这种当然和OSD一样也是有两种方式,一种是源头就贴好了,一种是将结果发给软件 ...
- Qt编写安防视频监控系统29-掉线重连
一.前言 掉线重连在很早很早以前就做了,基本上的方法都是搞个变量存储最后收到图片的时间,然后开个定时器判断,如果不在暂停模式下,当前时间和最后收到图片的时间差值超过了设定的超时时间,比如5s则认为掉线 ...
- .NET 响应式编程 System.Reactive 系列文章(一):基础概念
.NET 响应式编程 System.Reactive 系列文章(一):基础概念 引言 在现代软件开发中,处理异步事件和数据流已经成为常见的需求,比如用户输入.网络请求.传感器数据等.这些数据流通常是无 ...
- Python语言中进程、线程、协程执行效率分析
- SpringCloud Alibaba(一) - Nacos 服务注册与发现,OpenFeign远程调用
1.基础项目过目介绍 1.1 数据库创建 1.2 项目模块分布 1.3 测试http接口调用 1.3.1 http接口调用配置类 //http接口调用配置类 @Configuration public ...
- Android基础入门教程-参考资料
2)看视频 网上关于Android的视频教程有很多,这里分享下基神力荐的黑马教程吧: 黑马28期Android全套视频无加密完整版:密码:h7jz 52期不加密版:密码:zve8 当然下面这些视频学习 ...
- Elasticsearch(5) --- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)
这篇博客的命令分为ES集群相关命令,索引CRUD命令,文档CRUD命令.这里不包括Query查询命令,它单独写一篇博客. 一.ES集群相关命令 ES集群相关命令主要是_cat命令,所以这里详细讲解下该 ...