一文搞懂加密和接口签名小知识

news2024/11/16 19:48:37

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

主要分为四个部分介绍:

一、基础概念

二、加密算法介绍

三、接口签名

四、实例分析

一、基础概念

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

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

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唯一,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 27 移除元素 代码逐行讲解

Leetcode 27 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考…

Go语言中的结构体详解

关于 Golang 结构体 Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们…

【Python】二维离散小波变换(2D-DWT)实现

文章目录 小波变换程序实现子带数学公式 小波变换 小波变换(Wavelet Transform)是一种数学信号处理技术,用于将信号或图像分解为不同频率的小波成分,从而可以在不同时间尺度上分析信号的特征。小波变换具有许多重要的特性&#x…

安装Python之后 安装库报错 There was an error checking the latest version of pip.

报错代码 & 图片如下 Looking in indexes: https://pypi.tuna.tsicmdnghua.edu.cn/simple WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HT…

Matplotlib_概述_绘制图象

⛳绘制基础 在使用 Matplotlib 绘制图形时&#xff0c;其中有两个最为常用的场景。一个是画点&#xff0c;一个是画线。 pyplot 基本方法的使用如下表所示 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴名称xticks(x, ticks, rotation)设置 x 轴的…

【蓝图】p44简单解密机关

p44简单解密机关 p44简单解密机关文字提示开门文字提示开灯For Each Loop和For Each Loop With Break区别For Each LoopFor Each Loop With Break小操作&#xff1a;改变走线Execute Console Command(执行控制台命令) p44简单解密机关 文字提示开门 创建Actor蓝图类&#xff…

软件测试生命周期

本章简要介绍了软件开发项目中常用的生命周期模型&#xff0c;并解释了测试在每个模型中扮演的角色。它讨论了各种测试级别和测试类型之间的区别&#xff0c;并解释了这些在开发过程中的应用位置和方式。 大多数软件开发项目是按照事先选择的软件开发生命周期模型来计划和执行…

win11任务栏不合并 终于回归啦

25915.1000 win11任务栏不合并 终于回归啦&#xff01;&#xff01;&#xff01; 下载地址&#xff1a;https://uup.rg-adguard.net/

Jenkins搭建最简教程

纠结了一小会儿&#xff0c;到底要不要写这个&#xff0c;最终还是决定简单记录一下&#xff0c;因为Jenkins搭建实在是太简单了&#xff0c;虽然也有坑&#xff0c;但是坑主要在找稳定的版本上。 先学一个简称&#xff0c;LTS (Long Term Support) 属实是长见识了&#xff0c…

Excel透视表与python实现

目录 一、Excel透视表 1、源数据 2、数据总分析 3、数据top分析 二、python实现 1、第一张表演示 2、第二张表演示 一、Excel透视表 1、源数据 1&#xff09;四个类目&#xff0c;每类50条数据 2&#xff09;数据内容 2、数据总分析 1&#xff09;选择要分析的字段&…

live-server本地起node服务解决跨域问题

一、初始化node,构建package.json NPM 全局安装live-server npm install -g live-server在当前项目文件夹下cmd运行&#xff1a; npm init -y此时会在根目录下生成一个package.json文件。 二.生成代理脚本 在根文件夹新建一个build.js文件&#xff08;名字可以自定义) var …

银行项目性能压测?关键链路性能压力测试,测试老鸟总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 随着银行业数字化…

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集 前言相关介绍COCO格式实例分割数据集转换为YOLO格式实例分割数据集coco格式对应的json文件&#xff0c;以test.json为例格式转换代码&#xff0c;内容如下 前言 由于本人水平有限&#xff0c;难免出现错漏&#xf…

MySQL基础(五)主从复制及读写分离

目录 前言 一、概述 &#xff08;一&#xff09;、MySQL Replication &#xff08;二&#xff09;、MySQL复制类型 &#xff08;三&#xff09;、MySQL支持的复制方式 二、部署MySQL主从异步复制 &#xff08;一&#xff09;、master&#xff08;主&#xff09; &#x…

一起来学shiny把(3)—-添加控件

什么是shiny&#xff1f;Shiny是一个R包&#xff0c;可让您轻松地直接从 R 构建交互式 Web 应用程序&#xff08;应用程序&#xff09;。本系列是个长教程&#xff0c;带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧&#xff08;2&#xff09;》…

【C++11】——右值引用、移动语义

目录 1. 基本概念 1.1 左值与左值引用 1.2 右值和右值引用 1.3 左值引用与右值引用 2. 右值引用实用场景和意义 2.1 左值引用的使用场景 2.2 左值引用的短板 2.3 右值引用和移动语义 2.3.1 移动构造 2.3.2 移动赋值 2.3.3 编译器做的优化 2.3.4 总结 2.4 右值引用…

开源盛行:为什么学习国产达梦数据库?

开源盛行&#xff1a;为什么学习国产达梦数据库&#xff1f; 武汉达梦数据库股份有限公司成立于2000年&#xff0c;是国内领先的数据库产品开发服务商&#xff0c;国内数据库基础软件产业发展的关键推动者。公司为客户提供各类数据库软件及集群软件、云计算与大数据等一系列数据…

【数据结构】·顺序表函数实现·赶紧学起来呀

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

element-ui使用动态渲染下拉选择框el-select已经选择的下拉框的值不可以重复选择让其disabled

调接口拿到下拉框数据的数据的时候将其disabled全为true 但是如果编辑的时候就需要与详情接口对比&#xff0c;如果有id一致就将disabled为true if (res.code 0) {if (this.dialogtitle "新增合同") {res.data.map((v) > {v.nameUnitVoList.forEach((item) >…

九耶:产品经理面试题 ——请说说工作中你主导的产品上线后你会关注哪些数据指标?

【面试官考察的点】 实际的产品工作中需要通过数据驱动业务&#xff1a;产品经理了解用户对不同功能的使用情况&#xff0c;行为特征和使用反馈&#xff0c;这样可以为产品的改进提供很好的方向。面试官想考察你是否具备数据分析的意识和能力。 【满分回答】 在产品上线后&am…