# EncryptedInterface **Repository Path**: iNatsk/encrypted-interface ## Basic Information - **Project Name**: EncryptedInterface - **Description**: 用来实现接口请求数据加密. - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-04-30 - **Last Updated**: 2025-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 说明 本项目是接口访问加密的示例项目, 采用RSA和AES对接口进行数据加密. ## 加密实现类 ``` com.ruoyi.common.filter.DecryptionFilter ``` ## 准备工作 - 服务端生成RSA密钥 ``` openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048 ``` - 提取公钥 ``` openssl rsa -in private_key.pem -pubout -out public_key.pem ``` ## 加密流程 1. 客户端生成AES密钥和IV. 2. 客户端使用AES密钥对请求参数进行加密. 3. 客户端使用RSA公钥对AES密钥进行加密. 4. 客户端将加密后的AES密钥和IV放到header中. 把加密后的请求参数放到body中. 发送请求 5. 服务端接收到数据, 使用RSA私钥对AES密钥进行解密. 6. 服务端使用AES密钥对body中的参数进行解密. 7. 放行给接口实现类进行业务处理. 8. 生成新的iv. 9. 使用AES密钥和新的iv对返回内容进行加密. 10. 客户端使用密钥和服务端发送过来的IV进行解密. 11. 解密完成后, 把明文提供给业务处理函数进行正常的业务流程. ## 客户端示例程序 ``` 存放到doc/client目录下 ``` ## python 客户端示例程序运行说明 ### Python运行环境 - Python 3.13.2 ### 环境配置 - python -m venv .venv - .\.venv\Scripts\activate - pip install -r requirements.txt ### 示例运行方法 ``` python .\ClientEncryptionExample.py ``` ### 服务端响应 ``` {"msg":"操作成功","code":200,"data":{"title":"Python"}} ``` ## php 客户端示例程序运行说明 ### PHP示例运行环境 - Composer version 2.8.8 2025-04-04 16:56:46 - PHP version 8.4.6 ### 安装及运行 在php示例程序根目录下运行如下命令 - composer install - .\vendor\bin\phpunit - 运行结果如下 ``` PHPUnit 11.2.6 by Sebastian Bergmann and contributors. Runtime: PHP 8.4.6 Configuration: D:\svn\SuperMonitor\EncryptionClient\php\phpunit.xml 服务端响应: {"msg":"操作成功","code":200,"data":{"title":"php"}}. 1 / 1 (100%) Time: 00:00.049, Memory: 10.00 MB OK (1 test, 1 assertion) ``` ## java 客户端示例程序运行说明 ### 运行环境 java version "11.0.21" 2023-10-17 LTS ### 示例程序运行方法 ``` run.bat ``` ### 返回内容 ``` {"msg":"操作成功","code":200,"data":{"title":"Java"}} ``` ## ApiPost 接口测试工具配置说明 ### apipost 调用接口配置说明 ``` 使用apipost等测试工具对加密接口进行调用, 由于apipost无法自己生成AES密钥以及进行加密。 后台单独提供了2个接口,用来为apipost调用测试接口进行数据加密和对测试接口返回的数据进行解密。 加密接口的相对地址是:/encryption/getEncryptionBody 解密接口的相对地址是:/encryption/getDecryptionBody 分别在apipost的预执行脚本和后执行脚本中, 进行调用。 为了方便测试, 我们提供了全部的apipost配置。 请按照如下操作进行配置。 ``` ### 以下是apipost的配置流程。 其中http://localhost:8080/encryption/getEncryptionBody需要根据实际情况更换地址。 1. 在全局参数中添加Header --- - 参数名:X-API-Version - 参数值:V1 --- - 参数名:Content-Type - 参数值:application/json --- 2. 添加预执行操作 自定义脚本 ``` var raw = JSON.parse(apt.request.body.raw) var strRaw = JSON.stringify(raw); try { const response = await apt.sendRequest({ url: "http://localhost:8080/encryption/getEncryptionBody", method: "POST", body: strRaw }); var ret = response.json()['data']; apt.request.body.raw = ret['body']; var key = ret['key']; var iv = ret['iv']; var aesKeyRSA = ret['esaKeyRSA']; apt.setRequestHeader("X-Encrypted-AES-Key", aesKeyRSA); apt.setRequestHeader("X-Encrypted-AES-IV", iv); apt.globals.set("key", key); } catch (err) { console.error(err); } ``` 3. 添加后执行操作脚本 ``` var iv = apt.response.headers.get('X-Encrypted-AES-IV') var key = apt.globals.get("key"); try { // 配置请求头,包括 X-Encrypted-AES-IV const data = { 'iv': iv, 'data': apt.response.raw.responseText, 'key': key // 你可以在这里添加其他需要的请求头 // 'Authorization': 'Bearer your_token_here' }; const response = await apt.sendRequest({ url: "http://localhost:8080/encryption/getDecryptionBody", method: "POST", body: JSON.stringify(data) }); apt.response.raw.responseText = response.json()['msg'] } catch (err) { console.error(err); } ``` 4. 根据具体的接口文档进行接口参数填写。 比如《加密测试接口》 在body中, 选择json格式的raw。 然后在body中填写 ``` { "title": "How are you i'm find think you !" } ``` 5. 点击执行, 返回内容如下。 接口测试的过程中, 直接参数和返回值都是直接显示明文, 按照以上配置在全局参数中配置一次后,后续接口调用无需在考虑加密问题。 ``` { "msg": "操作成功", "code": 200, "data": { "title": "How are you i'm find think you !" } } ``` ### 作者微信