【涨薪技术】掌握加密签名接口测试实战!

接口加密是指在网络传输过程中,将数据进行加密,以保护数据的安全性。接口加密可以采用多种加密算法,如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。

1加密与加密算法

加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。也就是说加密算法是可逆的,而且其加密后生成的密文长度和明文本身的长度有关。所以如果被保护数据在以后需要被还原成明文,则需要使用加密。

在加密算法中又分为对称加密(symmetric encryption)和非对称加密(asymmetric encryption)

2对称加密

对称加密采用了对称密码编码技术,它的特点是加密和解密都是用同一个密钥,这种方法在密码学中叫做对称加密算法.

对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高.

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES

注意: 因为前端的透明性,对于登录密码等敏感信息,就不要使用JavaScript来进行对称加密. 因为别人可以从前端得到密匙后,可以直接对信息进行解密!

(1)甲方选择某一种加密规则,对信息进行加密;
(2)乙方使用同一种规则,对信息进行解密。
由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算
法"(Symmetric-key algorithm)。
这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无
法解密。保存和传递密钥,就成了最头疼的问题。

3非对称加密

非对称加密算法需要两个密钥:

公钥(publickey)和私钥(privatekey)

公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密算法实现机密信息交换的基本过程是:甲方生成对密钥并将其中的一把作为公钥向其它方公开;得到该公钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公钥加密后的任何信息。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人
都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
1976年,两位美国计算机学家Whitfield Diffie 和 Martin
Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完
成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发
了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这
两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
这种新的加密模式被称为"非对称加密算法"。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

4单向散列

哈希加密:

哈希(Hash)是将目标文本转换成具有固定长度的字符串(或叫做消息摘要)。当输入发生改变时,产生的哈希值也是完全不同的。从数学角度上讲,一个哈希算法是一个多对一的映射关系,对于目标文本 T,算法 H 可以将其唯一映射为 R,并且对于所有的 T,R 具有相同的长度,所以 H 不存在逆映射,也就是说哈希算法是不可逆的。

基于哈希算法的特性,其适用于该场景:被保护数据仅仅用作比较验证且不需要还原成明文形式。比较常用的哈希算法是 MD5 和 SHA1。我们比较熟悉的使用哈希存储数据的例子是:当我们登录某个已注册网站时,在忘记密码的情况下需要重置密码,此时网站会给你发一个随机的密码或者一个邮箱激活链接,而不是将之前的密码发给你,这就是因为哈希算法是不可逆的。

需要注意的是:在 Web 应用中,在浏览器中使用哈希加密的同时也要在服务端上进行哈希加密。

服务端哈希加密原因:一方面因为不需要将密文解密成明文来比对密码,另一方面是一旦加密算法和密钥泄露,那么整个用户资料库就相当于明文存储了。如果前端传过来的是明文,那么在注册时将其哈希,存入数据库。登录时,将密码哈希和数据库对应的数据比对,若一致则说明密码正确。

现在,对于简单的哈希算法的攻击方法主要有:寻找碰撞法和穷举法。所以,为了保证数据的安全,可以在哈希算法的基础上进一步的加密,常见的方法有:加盐、慢哈希、密钥哈希、XOR 等。

5数字签名

数字签名主要用于:确认信息来源于特定的主体且信息完整、未被篡改,发送方生成签名,接收方验证签名。

发送方: 首先计算目标文本的摘要(哈希值),通过私钥对摘要进行签名,将目标文本和电子签名发送给接收方。

接收方: 验证签名的步骤如下:

1. 通过公钥破解电子签名,得到摘要 D1 (如果失败,则信息来源主体校验失败);

2. 计算目标文本摘要 D2;

3. 若 D1 === D2,则说明目标文本完整、未被篡改。

数字签名与非对称加密区别:

非对称加密(加密/解密):公钥加密,私钥解密

数字签名(签名/验证):私钥签名,公钥验证

加密签名接口实战

01使用digest函数进行散列

摘要函数在特定的哈希算法中返回加密的值,并带有可选的salt,大写字母和变量名。

02使用commons-codec进行加密处理

什么是commons-codec

Apache Commons Codec软件包包含用于各种格式(例如Base64和
都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
1976年,两位美国计算机学家Whitfield Diffie 和 Martin
Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完
成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发
了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这
两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
这种新的加密模式被称为"非对称加密算法"。

使用commons-codec进行加密

1)URL编码

System.out.println(URLEncoder.encode("原文", "UTF-
8"));

2)MD5

MessageDigest md = MessageDigest.getInstance("MD5");
// JDK提供的MD5方法
byte[] md5Bytes = md.digest("原文".getBytes()); //
加密字节序列 得到 128个比特的摘要,即16字节
System.out.println(Hex.encodeHex(md5Bytes)); // 每4
个比特转成一位16进制数
System.out.println( DigestUtils.md5Hex("原文")); //
Apache common codec 提供的MD5方法,最终调用的还是JDK

3)SHA

//SHA-1(160比特)、SHA2(SHA-256、SHA-384、SHA-512)
MessageDigest md = MessageDigest.getInstance("SHA-
256"); // JDK提供的SHA方法
byte[] md5Bytes = md.digest("原文".getBytes());
System.out.println(Hex.encodeHex(md5Bytes));
System.out.println( DigestUtils.sha256Hex("原文"));
// Apache common codec 提供的SHA方法,最终调用的还是JDK

4)Base64

BASE64Encoder encoder = new BASE64Encoder(); // JDK
提供
String enStr = encoder.encode("原文".getBytes());
// 编码
enStr = base64Img.replaceAll("[\\s*\t\n\r]", "");
// 去掉可能有的换行符
System.out.println(enStr);
BASE64Decoder decoder = new BASE64Decoder();
System.out.println(new
String(decoder.decodeBuffer(enStr))); // 解码
byte[] result = Base64.encodeBase64("原
文".getBytes()); // Apache common codec提供
System.out.println(new
String(Base64.decodeBase64(result))); // 解码

5)AES

// 生成key
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128); // 确定密钥长度
byte[] keyBytes = kg.generateKey().getEncoded();
// 格式化key
Key key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher =
Cipher.getInstance("AES/ECB/PKCS5Padding"); // 确定算
法
cipher.init(Cipher.ENCRYPT_MODE, key); // 确定密钥
byte[] result = cipher.doFinal("原文".getBytes());
// 加密
System.out.println(Base64.encodeBase64String(result)
); // 不进行Base64编码的话,那么这个字节数组对应的字符串就
是乱码
cipher.init(Cipher.DECRYPT_MODE, key); // 进入解密模式
System.out.println(new
String(cipher.doFinal(result))); // 解密

6)RSA

// 生成密钥对
KeyPairGenerator keyPairGenerator =
KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair =
keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey =
(RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey =
(RSAPrivateKey)keyPair.getPrivate();
// 格式化私钥
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new
PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory =
KeyFactory.getInstance("RSA");
PrivateKey privateKey =
keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA"); // 确定算
法
cipher.init(Cipher.ENCRYPT_MODE, privateKey); // 确
定加密密钥
byte[] result = cipher.doFinal("原文".getBytes());
// 加密
System.out.println(Base64.encodeBase64String(result)
);
// 格式化公钥
X509EncodedKeySpec x509EncodedKeySpec = new
X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey =
keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA"); // 确定算法
cipher.init(Cipher.DECRYPT_MODE, publicKey); // 确
定公钥
System.out.println(new
String(cipher.doFinal(result))); // 解密

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:自动化测试老司机! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

平衡,才是世界生生不息的真谛

凤凰涅槃,浴火重生。这句话是很有哲理的,可以运用到命运中。而对于命运,以中为最好,即是平衡。然而,每一个人,都是要经历命运的锤炼,无论怎样锤炼,都要保持一颗善良的心,…

2024.02.23作业

1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …

记录 | docker内执行apt update报错GPG error

1. 执行 sudo apt-get update 命令时遇到这个错误,是服务器没有这个公钥的意思 rootadmin:~# sudo apt-get update Get:1 https://download.docker.com/linux/ubuntu focal InRelease [36.2 kB] Err:1 https://download.docker.com/linux/ubuntu focal InRelease T…

python 3.11中安装sympy(符号工具包)

1.python环境: 2.安装遇到问题: … 3.升级pip cmd命令行中,执行如下命令: python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中,执行如下命令: pip install sympy 5.简单应用 对…

排列组合简单详解(附10题)(会员版)

非会员,不用注册会员也能看! https://blog.csdn.net/Runcode8/article/details/136274861https://blog.csdn.net/Runcode8/article/details/136274861 一、认识C,P,A: A.排列 A(x,y)=(x!)/[(x-y)!]=x(x-1)...(x-y+1) P.排列 P(x,y)=A(x,y) C.组合 C(x,…

针对无法确定连接参数的网口通讯PLC采集方案

年前碰到了一个需求, 需要针对倍福PLC进行数据采集, 搞定了PLC通讯协议后, 最大的问题出现了, 我们不知道PLC的密码, 没办法进入到PLC查询到点位, 而且也没办法对PLC设置路由, 导致没有办法连上…

Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解 code review! 文章目录 Linux笔记之LD_LIBRARY_PATH详解1.常见使用命令来设置动态链接库路径2.LD_LIBRARY_PATH详解设置 LD_LIBRARY_PATH举例注意事项 3.替代方案使用标准路径编译时指定链接路径优先使用 rpath 还是 runpath?注意…

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

瑞_23种设计模式_外观模式

文章目录 1 外观模式(Facade Pattern)1.1 介绍1.2 概述1.3 外观模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 jdk源码解析 🙊 前言:本文章为瑞_系列专栏之《23种设计模式》的外观模式篇。本文中的部分…

【Vuforia+Unity】AR02-长方体物体识别(Multi Targets)

1.创建模型 选择多维长方体图,这个长方体是生活中的真实物体的拍摄图,提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId=0ddbb5c17e7f4bf090834650bbea4995&av=false 设置长宽高,这个长宽高需要…

学算法要读《算法导论》吗?

大家好,我是 方圆。这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间,也为了给经典的“黑皮书”祛魅,我觉得这些书籍在大部分互联网从业者心中已经不再是…

数组与指针相关

二级指针与指针数组 #include <stdio.h> #include <stdlib.h> int main() { // 定义一个指针数组&#xff0c;每个元素都是一个指向int的指针 int *ptr_array[3]; // 为指针数组的每个元素分配内存 ptr_array[0] malloc(2*sizeof(int)); ptr_array[1] m…

USB Micro引脚及相应原理图绘制

前言&#xff1a;博主为实现绘制USB Micro输入口原理图&#xff0c;首先在 GD32F103XX的数据手册中找到引脚的功能描述&#xff0c;找到USBDM与USBDP功能&#xff0c;分别为引脚PA11与引脚PA12。然后进行相应的原理图绘制。 * USBDM。USBDM 引脚是与通用串行总线 (Universal Se…

20210505-20240223 CSDN 1024天 创作纪念日

作为一个小白&#xff0c;我没想到自己在不知不觉间就走过了如此长久的一段旅程。恍然间&#xff0c;三年多的时光已经过去了。 机缘 我首次写博客是为了记录日常&#xff0c;分享生活。 在这1024天里&#xff0c;我做了一些记录和分享&#xff0c;特别是遇到一些有趣的、值得…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月&#xff0c;我都在忙着构建我的第一开源项目 HexoPress&#xff0c;这个项目是使用 Electron Vue 3 TypeScript 等技术实现的&#xff0c;一方面&#xff0c;我真的很需要一款合自己心意的博客编辑器&#xff0c;另一方面&#xff0c;我也是真心想学习 Electron …

面试经典150题【11-20】

文章目录 面试经典150题【11-20】388.O(1) 时间插入、删除和获取随机元素238.除自身以外数组的乘积134加油站135.分发糖果42. 接雨水13.罗马数字12.整数 转 罗马数字58.最后一个单词的长度14.最长公共前缀151.反转字符串中的单词 面试经典150题【11-20】 388.O(1) 时间插入、删…

[今天跟AI聊聊职场] ~你能接受你的直接领导能力不如你,年纪还比你小很多吗?

知乎问题&#xff1a; 弟弟今年35岁&#xff0c;刚换了一份工作&#xff0c;直接领导小A比他小5岁&#xff0c;各方面经验没有他成熟。难的工作都是弟弟在做&#xff0c;功劳都被直接领导小A抢走了&#xff0c;有时候还要被直接领导小A打压。弟弟感觉升职加薪无望。现在找工作不…

Movelt使用笔记-Movelt Setup Assistant

目录 Setup Assistant配置1 Start 加载urdf模型3 Virtual joints 虚拟关节5 Robot Poses 机器人位姿7 Passive Joints 被动关节8 Controllers 控制器9 Simulation 仿真10 3D Perception 3D感知11 Author Information 作者信息12 Configuration Files 配置文件启动MoveIt!Setup…

Vulnhub-OSCP

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 17:49 CST Nmap scan report for 192.168.1.1 Host is up (0.00052s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.1.…

深度解析:Integer.parseInt() 源码解读

深度解析&#xff1a;Integer.parseInt() 源码解读 关键要点 解析字符&#xff1a;用于将字符转换为对应的数字值 Character.digit(s.charAt(i),radix) 确定limit&#xff1a;根据正负号分别设定 int limit -Integer.MAX_VALUE;【正】 limit Integer.MIN_VALUE;【负】 负数…