最近在做的接口自动化测试工程中,一些接口需要签名,涉及到了加解密的一些知识,顺手梳理了下,分享给大家。
主要分为四个部分介绍:
一、基础概念
二、加密算法介绍
三、接口签名
四、实例分析
一、基础概念
加密是开发同学会经常用到的技术,应用场景也有很多,例如文件完整性验证,用户登录,数据交易等等,不同的场景需要使用不同的加密算法。
我们先来了解五个基础的概念:
1、加密:就是在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。
2、解密:就是将加密还原成原始数据。
3、明文:未被加密过的原始数据。
4、密文: 指通过某种加密算法将明文转换成难以理解的加密数据,密文是加密后的数据,无法直接从中获取原始信息,只有持有正确密钥的授权方能够将密文还原成原始的明文。
5、密钥: 它是一个参数,是在明文转换为密文或将密文转换为明文的算法中输入的参数,密钥分为对称密钥与非对称密钥,分别应用在对称加密算法和非对称加密算法上。
二、加密算法介绍
加密算法主要分为三种类型:
一)哈希算法(摘要算法)
哈希算法也称为摘要算法或散列算法(严格意义上哈希算法不是加密算法),它主要将任意长度的数据转换为固定长度的数据串,数据串通常用16进制的字符串表示。
哈希算法是单向的,即无法通过哈希值逆向推导出原始数据。相同的输入始终产生相同的哈希值,但微小的数据变化会导致完全不同的哈希值。
哈希算法用于数据完整性验证、密码存储和数据唯一性校验等场景。
特点:
1、不可逆
2、加密不需要秘钥
3、任意长度转为固定长度
常见的哈希算法:
MD5、SHA-1、SHA-256等。
使用场景:
生成签名、存储密码、校验文件完整性等
二)对称加密算法
对称加密算法也称为传统加密算法,它在加密和解密过程中使用相同的密钥。
发送方使用密钥对数据进行加密,接收方使用相同的密钥进行解密。由于密钥是相同的,对称加密算法的加密和解密速度较快,适用于对大量数据进行加密和解密操作。
特点:
1、加密和解密使用的密钥相同
2、可逆
3、 对称加密算法速度比非对称加密算法较快,适合对大量数据进行加密
常见的算法:
DES(数据加密标准)、3DES(三重数据加密标准)、AES(高级加密标准)等
使用场景:
- 数据传输:对称加密算法适用于双方之间需要加密和解密大量数据的场景,如数据传输过程中的通信数据加密。
- 文件加密:对称加密算法可用于对文件进行加密,确保文件在存储和传输过程中不被非授权人员访问和查看。
- 数据库加密:对称加密算法用于对数据库中的敏感数据(如用户个人信息、支付信息等)进行加密保护,增加数据库数据的安全性。
三)非对称加密算法
非对称加密算法也称为公钥加密算法,它使用一对相关联的密钥:公钥和私钥。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。公钥可以公开传输,而私钥必须保密保存。
非对称加密算法通常用于加密通信、数字签名和密钥交换等场景。
特点:
1、需要公钥和私钥一对密钥
2、公钥加密私钥解密,公钥验签私钥加签
常见的算法:
RSA(RSA加密算法)、ECC(椭圆曲线加密)等
使用场景:
1、数字签名:非对称加密算法可用于生成数字签名,以验证数据的来源和完整性。发送方使用自己的私钥对数据生成数字签名,接收方使用发送方的公钥验证签名,以确保数据未被篡改且来自合法的发送方。
2、加密通信:非对称加密算法用于加密通信,确保通信双方之间传输的数据在传输过程中不被窃取或篡改。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。
3、密钥交换:非对称加密算法可用于密钥交换,安全地传输对称加密算法所需的密钥。例如,在TLS/SSL握手过程中,客户端和服务器使用非对称加密算法交换对称加密算法的会话密钥。
三、接口签名
在接口中,签名(sign)通常是一种用于确保接口请求的数据完整性和来源认证的机制。它用于防止接口请求被篡改或伪造,确保请求的可靠性和安全性。
接口签名的实现一般涉及以下步骤:
- 生成签名原文: 在发送接口请求之前,客户端会根据接口请求参数和一些其他信息(如时间戳、随机数等)生成一个待签名的原始字符串,通常将这个原始字符串称为签名原文。签名原文是由接口请求中的关键信息按照一定规则拼接而成。
- 签名算法: 客户端使用一种签名算法,通常是哈希算法(例如MD5、SHA-256)或HMAC(Hash-based Message Authentication Code)算法,对签名原文进行签名。签名算法通常需要使用一个密钥或密钥对(公钥和私钥),密钥的安全性对于签名的可靠性非常重要。
- 添加签名到请求: 客户端将生成的签名值添加到接口请求参数中,一般以名为"sign"的字段携带。
- 服务端验证签名: 接收到接口请求的服务端,在处理请求之前,会对请求的参数和签名原文按照相同的规则再次计算签名。然后,服务端使用与客户端相同的签名算法和密钥对,对接收到的签名值进行验证。如果服务端计算的签名值与接收到的签名值一致,则验证通过,说明请求数据完整且来源可信;否则,验证失败,服务端可能拒绝继续处理该请求或返回错误信息。
通过接口签名,可以有效防止请求参数被篡改或伪造,提高接口请求的安全性。接口签名在客户端和服务端之间建立了一种信任机制,确保了数据传输的可靠性和安全性。
四、实例分析
下面举个例子作详细的说明:
一)接口请求参数
开启红包接口,请求方式为post
POST /v1/api/red/open
json请求参数
{
"red_id":1,
"timestamp":"1667033841",
"sign":xxxxxxxxxxxxxxxxx
}
二)签名sign的算法
1、将请求参数按照键名进行升序排序,需要带上时间戳
2、拼接秘钥,将秘钥拼接在参数后面
3、将拼接后的结果取md5值
4、取hash值
三)利用JMeter编写自动化脚本
1、脚本思路
用户自定义变量key(找开发同学要),随机变量红包获取红包id,Bean Shell PreProcessor获取当前时间戳
2、用户自定义变量key(找开发同学要)
3、随机变量红包获取红包id,是1到100的数字
4、获取当前时间戳Bean Shell PreProcessor
代码:
import java.util.Map;
import java.lang.String;
timestamp = System.currentTimeMillis()/1000;
vars.put("timestamp",timestamp.toString());
5、HTTP请求,开启红包
6、sign的计算方法:
先将请求参数按照键名进行升序排序,需要带上时间戳,也就是red_id=${red_id}×tamp=${timestamp},再拼接key,red_id=${red_id}×tamp=${timestamp}${key},取MD5值,可在函数助手中生成
再取hash值,需要注意是哪种算法,有的是SHA-1,有的是SHA-256
四)接口请求过程
客户端将请求参数red_id和timestamp和签名sign一起发送给服务端, 服务端在处理请求之前,会对请求的参数和签名原文按照相同的规则再次计算签名,接着,服务端使用与客户端相同的签名算法和密钥对,对接收到的签名值进行验证。
如果服务端计算的签名值与接收到的签名值一致,则验证通过,否则,验证无效。
我是程序员馨馨,全网ID唯一,转载请注明出处。