最近在做的接口自动化测试工程中,一些接口需要签名,涉及到了加解密的一些知识,顺手梳理了下,分享给大家。

主要分为四个部分介绍:

一、基础概念

二、加密算法介绍

三、接口签名

四、实例分析

一、基础概念

加密是开发同学会经常用到的技术,应用场景也有很多,例如文件完整性验证,用户登录,数据交易等等,不同的场景需要使用不同的加密算法。

我们先来了解五个基础的概念:

1、加密:就是在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。

2、解密:就是将加密还原成原始数据。

3、明文:未被加密过的原始数据。

4、密文: 指通过某种加密算法将明文转换成难以理解的加密数据,密文是加密后的数据,无法直接从中获取原始信息,只有持有正确密钥的授权方能够将密文还原成原始的明文。

5、密钥: 它是一个参数,是在明文转换为密文或将密文转换为明文的算法中输入的参数,密钥分为对称密钥与非对称密钥,分别应用在对称加密算法和非对称加密算法上。

二、加密算法介绍

加密算法主要分为三种类型:

一)哈希算法(摘要算法)

哈希算法也称为摘要算法或散列算法(严格意义上哈希算法不是加密算法),它主要将任意长度的数据转换为固定长度的数据串,数据串通常用16进制的字符串表示。

哈希算法是单向的,即无法通过哈希值逆向推导出原始数据。相同的输入始终产生相同的哈希值,但微小的数据变化会导致完全不同的哈希值。

哈希算法用于数据完整性验证、密码存储和数据唯一性校验等场景。

特点

1、不可逆

2、加密不需要秘钥

3、任意长度转为固定长度

常见的哈希算法

MD5、SHA-1、SHA-256等。

使用场景

生成签名、存储密码、校验文件完整性等

二)对称加密算法

对称加密算法也称为传统加密算法,它在加密和解密过程中使用相同的密钥。

发送方使用密钥对数据进行加密,接收方使用相同的密钥进行解密。由于密钥是相同的,对称加密算法的加密和解密速度较快,适用于对大量数据进行加密和解密操作。

特点:

1、加密和解密使用的密钥相同

2、可逆

3、 对称加密算法速度比非对称加密算法较快,适合对大量数据进行加密

常见的算法:

DES(数据加密标准)、3DES(三重数据加密标准)、AES(高级加密标准)等

使用场景

  1. 数据传输:对称加密算法适用于双方之间需要加密和解密大量数据的场景,如数据传输过程中的通信数据加密。
  2. 文件加密:对称加密算法可用于对文件进行加密,确保文件在存储和传输过程中不被非授权人员访问和查看。
  3. 数据库加密:对称加密算法用于对数据库中的敏感数据(如用户个人信息、支付信息等)进行加密保护,增加数据库数据的安全性。

三)非对称加密算法

非对称加密算法也称为公钥加密算法,它使用一对相关联的密钥:公钥和私钥。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。公钥可以公开传输,而私钥必须保密保存。

非对称加密算法通常用于加密通信、数字签名和密钥交换等场景。

特点:

1、需要公钥和私钥一对密钥

2、公钥加密私钥解密,公钥验签私钥加签

常见的算法:

RSA(RSA加密算法)、ECC(椭圆曲线加密)等

使用场景

1、数字签名:非对称加密算法可用于生成数字签名,以验证数据的来源和完整性。发送方使用自己的私钥对数据生成数字签名,接收方使用发送方的公钥验证签名,以确保数据未被篡改且来自合法的发送方。

2、加密通信:非对称加密算法用于加密通信,确保通信双方之间传输的数据在传输过程中不被窃取或篡改。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。

3、密钥交换:非对称加密算法可用于密钥交换,安全地传输对称加密算法所需的密钥。例如,在TLS/SSL握手过程中,客户端和服务器使用非对称加密算法交换对称加密算法的会话密钥。

三、接口签名

在接口中,签名(sign)通常是一种用于确保接口请求的数据完整性和来源认证的机制。它用于防止接口请求被篡改或伪造,确保请求的可靠性和安全性。

接口签名的实现一般涉及以下步骤:

  1. 生成签名原文: 在发送接口请求之前,客户端会根据接口请求参数和一些其他信息(如时间戳、随机数等)生成一个待签名的原始字符串,通常将这个原始字符串称为签名原文。签名原文是由接口请求中的关键信息按照一定规则拼接而成。

  1. 签名算法: 客户端使用一种签名算法,通常是哈希算法(例如MD5、SHA-256)或HMAC(Hash-based Message Authentication Code)算法,对签名原文进行签名。签名算法通常需要使用一个密钥或密钥对(公钥和私钥),密钥的安全性对于签名的可靠性非常重要。

  1. 添加签名到请求: 客户端将生成的签名值添加到接口请求参数中,一般以名为"sign"的字段携带。

  1. 服务端验证签名: 接收到接口请求的服务端,在处理请求之前,会对请求的参数和签名原文按照相同的规则再次计算签名。然后,服务端使用与客户端相同的签名算法和密钥对,对接收到的签名值进行验证。如果服务端计算的签名值与接收到的签名值一致,则验证通过,说明请求数据完整且来源可信;否则,验证失败,服务端可能拒绝继续处理该请求或返回错误信息。

通过接口签名,可以有效防止请求参数被篡改或伪造,提高接口请求的安全性。接口签名在客户端和服务端之间建立了一种信任机制,确保了数据传输的可靠性和安全性。

四、实例分析

下面举个例子作详细的说明:

一)接口请求参数

开启红包接口,请求方式为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}&timestamp=${timestamp},再拼接key,red_id=${red_id}&timestamp=${timestamp}${key},取MD5值,可在函数助手中生成

再取hash值,需要注意是哪种算法,有的是SHA-1,有的是SHA-256

四)接口请求过程

客户端将请求参数red_id和timestamp和签名sign一起发送给服务端, 服务端在处理请求之前,会对请求的参数和签名原文按照相同的规则再次计算签名,接着,服务端使用与客户端相同的签名算法和密钥对,对接收到的签名值进行验证。

如果服务端计算的签名值与接收到的签名值一致,则验证通过,否则,验证无效。

我是程序员馨馨,全网ID唯一,转载请注明出处。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐