接口开放平台设计:如何对接口数据进行加密脱敏返回?

207 阅读4分钟

对于数据安全性高的场景,客户需要对接口返回数据进行加密,客户端再进行解密。为了提升接口返回数据的安全性,支持接口返回数据内容的脱敏加密返回,即针对data接口返回数据加密,每个应用单独配置密钥,支持多种客户端编程语言进行解密。

ASE加密算法

采用 AES加密算法。请注意:为方便维护,iv和ASE密钥保持一致

AES(高级加密标准,Advanced Encryption Standard)是一种广泛使用的对称加密算法,用于保护电子数据的机密性。以下是其核心要点:

  • 对称加密:加密与解密使用同一密钥,需确保密钥安全传输。
  • 分组加密:将数据划分为128位(16字节)的固定块进行处理。
  • 密钥长度:支持128位、192位、256位三种密钥,安全性递增(如AES-128、AES-256)。
  • 抗攻击性:目前无已知高效攻击方式,暴力破解AES-128需数万亿年(假设每秒尝试1亿亿次)。

如何开启和关闭数据加密?

进入 开发平台的应用管理,点击【加密配置】按钮,在【接口数据加密开关】切换到【开启】。

首次配置加密时,请先【重新生成】ASE密钥。

点击【保存】后立即生效。

如何重置密钥?

如上,当需要重置应用数据加密的密钥时,在【加密配置】弹窗,【重新生成】ASE密钥后保存,即可生效。

加解密示例

示例1,加密返回对比

针对简单的hello world接口,未开启加密的返回是:

{
    "code": 200,
    "message": "SUCCESS",
    "data": {
        "hello_world": "hello world"
    }
}

开启加密后,针对data字段返回的简单字符串加密。加密返回是:

{
    "code": 200,
    "message": "SUCCESS",
    "data": "771272354e5401696a502a4a86e89a02d2c1b1cbba1bbe4a8b2d3600b9a7572a"
}

示例2,长数据的加密效果

针对返回的长数据的加密,data的值被AES加密后是:

解密效果,

客户端解密示例

以下示例中,将使用:

明文(原始数据)test
密文(加密数据)0a2f4f5923cc98b81fe0ea29f0f2ce16
AES密钥32dWoR8HEPIiwdju
iv32dWoR8HEPIiwdju

Java

使用Hutool工具包:plus.hutool.cn/pages/5ddde…

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
String data = "0a2f4f5923cc98b81fe0ea29f0f2ce16";
String aesKey = "32dWoR8HEPIiwdju";
AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, aesKey.getBytes(),aesKey.getBytes());
String decryptData = aes.decryptStr(data);

PHP

<?php
$data = "0a2f4f5923cc98b81fe0ea29f0f2ce16";
$fullData = hex2bin($data);
$key = "32dWoR8HEPIiwdju"; // 16字节密钥
// 1. Hex 解码并分离 IV 和密文
$iv = "32dWoR8HEPIiwdju";
// 解密
$decrypted = openssl_decrypt(
    $fullData,
    'aes-128-cbc',
    $key,
    1,
    $iv
);
if ($decrypted === false) {
    echo "解密失败:", openssl_error_string();
} else {
    echo "解密结果:", $decrypted; // 应输出原始明文
}

Python

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = "32dWoR8HEPIiwdju".encode("utf-8") ## AEC密钥
data = '0a2f4f5923cc98b81fe0ea29f0f2ce16' # 待解密数据
data=bytes.fromhex(data)
cipher = AES.new(key,AES.MODE_CBC,key) # 创建加密对象
decrypted = unpad(cipher.decrypt(data),AES.block_size) # 解密操作
print(decrypted.decode("utf-8")) # 输出解密后的数据

Javascript

使用crypto-js类库,Crypto-JS - JavaScript加密库,github.com/brix/crypto…

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

<div id="output"></div>

<script>
// 提供的密文、密钥和IV
var ciphertext = "ad8749ea0a206e935992e3b46f6bc78a3c90f936020fea78ccbd083171fb8f227d7dda924e99ff6d9781bcf044a4e19f";
var key = CryptoJS.enc.Utf8.parse("9bjjxs3p8u15n4iv"); // 密钥需要转换为Utf8格式
var iv = CryptoJS.enc.Utf8.parse("9bjjxs3p8u15n4iv");  // IV也需要转换为Utf8格式

// 将密文从Hex格式转换为CryptoJS可以处理的格式
var ciphertextHex = CryptoJS.enc.Hex.parse(ciphertext);

// 使用CryptoJS进行CBC解密
var plaintext = CryptoJS.AES.decrypt({
    ciphertext: ciphertextHex
}, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

var str = plaintext.toString(CryptoJS.enc.Utf8);
document.getElementById('output').innerHTML = str;

// 将解密后的结果转换为字符串并输出
console.log(str);
</script>

管理后台

管理员可以从管理后台的【应用管理】,进入【编辑】后重置 应用的密钥,开启或关闭接口数据加密,保存后立即生效。

关于YesApi Pro

YesApi Pro一套针对API接口进行快速研发、管理、开放以及收费的 软件系统、源代码和解决方案,专为企业研发和设计。

YesApi Pro 旗舰版 Java版 演示环境:
平台首页:
java.demo.yesapi.cn/
开放平台:
java.demo.yesapi.cn/platform/
管理后台:
java.demo.yesapi.cn/admin/
技术文档:
java.demo.yesapi.cn/wiki/