支付宝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 内容加密的所有内容啦,希望对你有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.依附弹窗(AttachListPopup)

愿你出走半生,归来仍是少年! 环境:.NET 7 基于基础的Popup对象实现的依附于某个控件的弹窗,弹窗可呈现数组对象,达到较好的选择交互效果。 1.布局 通过Border实现圆角边框轮廓,然后通过内部的ListView实现列表展示。…

Cesium数据加载

文章目录 0.引言1.影像加载1.1Bing地图1.2天地图1.3ArcGIS在线地图1.4高德地图1.5OSM影像1.6MapBox影像 2.OGC地图服务2.1WMS2.2WMTS2.3TMS 3.GeoJSON数据加载4.KML数据加载5.TIFF数据加载6.点云数据加载7.地形数据加载7.1在线地形数据加载7.2本地地形数据加载 8.倾斜摄影模型数…

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…

没有外网Nginx如何配置如何开启https

判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl,由于服务器没有外网,可以离线安装openssl-3.0.1.tar.gz,我是在有网的服务器直接下载的,然后再上传到这台无网的服务器上 wget https://www.open…

HttpClient的使用与封装

HttpClient的使用与封装 配置 首先,我们要引入maven依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>这里可以单独引入,如果我…

linux操作系统网络编程套接字(实现一个udp通讯demo)

文章目录 理解源IP地址和目的IP地址认识端口号理解 "端口号" 和 "进程ID理解源端口号和目的端口号 认识TCP协议认识UDP协议什么是面向字节流和面向数据报流以及有无连接是什么意思 网络字节序socket编程接口socket 常见APIsockaddr结构sockaddr_in 结构in_addr结…

下载大文件时内存溢出情况分析解决

基于SpringBoot和阿里的OSS实现了一个下载文件的功能。 大概原理是这样的&#xff1a; 用户请求下载资源&#xff0c;服务端接收到请求之后从OSS中将用户需要的资源捞出来&#xff0c;然后以流的方式写给客户端。 遇到一个这样的问题&#xff1a; 下载小文件没有问题&#…

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09; 水仙花数是指一个 3 位数&a…

去中心化人工智能迸发应用潜力,或给 Web3 带来无限畅想

​ 原文&#xff1a;https://www.caseycaruso.com/thoughts/decentralized-ai 作者&#xff1a;Casey&#xff5c;Paradigm 投资合伙人 编译&#xff1a;TinTinLand 编者注&#xff1a;本文对于去中心化 Web3 技术和人工智能领域之间的交叉应用进行了梳理&#xff0c;并列举了…

springboot130社团管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

什么是框架 确定伦敦金的框架为何重要?

在伦敦金投资中&#xff0c;我们要进行分析或者交易&#xff0c;都要将伦敦金走势置于一个框架内。什么才是框架呢&#xff1f;笔者认为&#xff0c;在当前伦敦金走势的上方和下方画出支撑阻力位&#xff0c;这就是框架。但我们要注意框架得能够立得起来&#xff0c;那才算是好…

理顺 QR 分解算法

咱们网站的这个公式编辑器&#xff0c;估计是后台生成图片后贴回来的&#xff0c;固定分辨率而且分辨率不高。 还不如先离线 latex 生成 pdf 后再截图上来 1. Why QR When A and b are known, to solver the minimization of , where . The reduction of A to various canoni…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

文本检索性能提升 40 倍,Apache Doris 倒排索引深度解读

在 OLAP 领域&#xff0c;Apache Doris 已成为高性能、高并发以及高时效性的代名词。在面向海量数据的复杂查询需求时&#xff0c;除硬件配置、集群规模、网络带宽等因素外&#xff0c;提升性能的核心在于如何最大程度地降低 SQL 执行时的 CPU、内存和 IO 开销&#xff0c;而这…

记 Rxjava zip操作符遇到的问题

在项目中遇到了类似下面这样的代码 本意是希望当zip操作符中三个Observable执行完毕之后&#xff0c;将他们返回的数据统一进行处理 Observable.zip(startFirst(), startSecond(), startThird(),(first, second, third) -> {Log.i("Rxjava", "handle all dat…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

H.264与H.265的主要差异

H.265仍然采用混合编解码&#xff0c;编解码结构域H.264基本一致&#xff0c; H.265与H.264的主要不同 编码块划分结构&#xff1a;采用CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit)的递归结构。 并行工具&#xff1a;增加了Tile以及WPP等并行工具集以提高编码速…