接口测试中的加密与签名技术详解
加密与解密基础
在接口测试中,数据的安全性至关重要。加密和解密是保障数据传输安全的核心技术。
- 加密:将原始数据(明文)转换为不可读的形式(密文),以防止被窃取。
- 解密:将加密后的数据还原为原始数据。
根据密钥的使用方式,加密可以分为两类:
- 对称加密:加密和解密使用同一密钥。
- 非对称加密:需要一对密钥——公钥和私钥。公钥用于加密,私钥用于解密。
常见加密算法
以下是几种常见的加密算法及其应用场景:
- DES:安全性较弱,通常用于旧系统。
- AES:广泛应用于前后端分离的接口加密。
- Base64:主要用于编码而非严格意义上的加密。
- RSA:一种非对称加密算法,具有高安全性。
非对称加密的实际应用
假设用户A和B之间进行数据传输:
- B将公钥发送给A。
- A使用该公钥加密数据并发送给B。
- B使用自己的私钥解密数据。
此外,非对称加密还支持数字签名功能:
- B使用私钥加密数据(签名)。
- A使用B的公钥解密数据,验证签名。
数字证书的作用
为了确保公钥的安全性,通常由CA(证书颁发机构)签发数字证书。数字证书包含用户基本信息、公钥信息以及有效期等。
例如,在HTTPS协议中,Fiddler无法直接抓取数据报文,需要安装CA提供的数字证书。
哈希算法简介
MD5是一种典型的哈希算法,生成固定长度的摘要值,无法逆向解密。
以下是在Postman中使用MD5的示例:
// 获取当前时间戳
let currentTime = new Date().getTime();
// 使用CryptoJS库进行MD5加密
let encryptedText = CryptoJS.MD5("admin").toString(CryptoJS.enc.Hex).toUpperCase();
接口签名机制
接口签名是一种验证请求合法性的方法,通常结合用户名、密码、时间戳和参数排序生成唯一的签名字符串。
具体步骤如下:
- 按ASCII码顺序对所有请求参数进行升序排列。
- 将参数名和参数值拼接成字符串。
- 在字符串头部添加appid和appsecret。
- 在字符串尾部添加时间戳。
- 对最终字符串进行32位MD5加密,并转换为大写。
以下是一个Postman实现的示例:
pm.preRequestScript = () => {
// 引入moment库获取时间戳
let moment = require('moment');
let currentTimestamp = moment().format('YYYYMMDDHHmmss');
// 设置全局变量time
pm.environment.set('time', currentTimestamp);
// 获取请求URL参数
let urlParams = pm.request.url.query.map(item => `${item.key}=${item.value}`);
urlParams.push(`showapi_timestamp=${currentTimestamp}`);
// 排序并排除sign字段
urlParams.sort();
let filteredParams = urlParams.filter(param => !param.includes('showapi_sign'));
// 拼接字符串并添加密钥
let signString = filteredParams.join('') + 'sssss';
let finalSign = CryptoJS.MD5(signString).toString(CryptoJS.enc.Hex).toUpperCase();
// 设置全局变量sign
pm.environment.set('sign', finalSign);
};
JMeter中的实现
在JMeter中,可以通过内置函数助手完成类似操作:
${__digest(MD5, admin, , )}
