在自动化测试时,Python常用的几个加密算法,你有用到吗
本文分享自华为云社区《『加密算法』| 自动化测试时基于Python常用的几个加密算法实现,你有用到吗?》,作者:虫无涯 。
写在前边
- 这几天做自动化测试,遇到一个问题,那就是接口的请求的密码是加密的;
- 产品的要求是不能使用其他特殊手段,他给提供加密算法,需要在接口请求的时候,使用加密算法处理后的数据传参;
- 其实这样来说反而简单了很多,因为已经知道加密算法,那就在传参前先把密码进行加密处理就行了(心理默默的想,这个产品也太好了吧);
- 本文主要是整理了几个加密算法,以便后续测试使用。
公用数据
- 为了方便后续举例,我们设计一个类,来把需要演示的加密算法统一封装起来:
# -*- coding:utf-8 -*- # 作者:虫无涯 # 日期:2023/12/1 # 文件名称:test_pass.py # 作用:常用的加密算法实现 # 联系:VX(NoamaNelson) # 博客:https://blog.csdn.net/NoamaNelson import hashlib class TestPass(): def __init__(self): super(TestPass, self).__init__() self.name = "admin" self.password = "123456" if __name__ == "__main__": test_pass = TestPass()
- 其中self.name模拟用户名数据,self.password模拟密码数据。
MD5直接加密
- MD5是一种常用的单向散列函数,是不可逆的,也就是说无法通过被加密后的结果来确定加密前的内容;
- 生成结果为固定的128位字节,一般为32位的十六进制字符串;
- 这里会使用到hashlib,这个一般python安装完都是有的,目录在:
X:\Python37\Lib\hashlib.py
- 直接加密实现:
def test_md5(self): md = hashlib.md5(self.password.encode()) md5_pass = md.hexdigest() print(f"密码{self.password}, md5直接加密后为:{md5_pass}")
- 输出为:
密码123456, md5直接加密后为:e10adc3949ba59abbe56e057f20f883e
用户名和密码组合MD5加密
- 有个真实的业务场景,在测试某个业务系统的时候,它不是简单的密码MD5加密;
- 而是使用用户名和密码组合后,先转小写再md5加密;
- 这个需求的实现过程为:
def test_md5_01(self): data = (self.name + self.password).lower() md = hashlib.md5(data.encode()) md5_pass = md.hexdigest() print(f"密码{self.password},用户名{self.name}, md5组合加密后为:{md5_pass}")
- 输出为:
密码123456,用户名admin, md5组合加密后为:a66abb5684c45962d887564f08346e8d
密码使用MD5+盐加密
- 这个场景是先把密码设置盐;
- 然后将盐拼接在原密码之后;
- 实现过程为:
def test_md5_02(self): s = self.password[:5] # 设置盐 md = hashlib.md5((self.password + s).encode()) md5_pass = md.hexdigest() print(f"密码{self.password},md5加盐后为:{md5_pass}")
- 输出为:
密码123456,md5加盐后为:e363373ddc24b34c5bb9d99abbfd8be5
MD5加盐后将密码整体插入盐中
- 这个场景也挺常见的,就是先设置盐;
- 然后将原密码和盐使用join方式处理;
- 实现过程为:
def test_md5_03(self): s = self.password[:6] # 设置盐 md = hashlib.md5((self.password.join(s)).encode()) md5_pass = md.hexdigest() print(f"密码{self.password},md5加盐使用json方法为:{md5_pass}")
- 输出为:
密码123456,md5加盐使用json方法为:43ec0d3f863b4f7e635e7169ddc18606
SHA1加密
- 这个和MD5类似,不过它的结果是160位字节,一般为40位的十六进制字符串;
- 它也是在hashlib中;
- 用户名和密码拼接后使用SHA1加密,实现如下:
def test_sha1(self): data = self.name + self.password sha1 = hashlib.sha1() sha1.update(data.encode("utf-8")) sha1_pass = sha1.hexdigest() print(f"密码{self.password},用户名{self.name}, sha1组合加密后为:{sha1_pass}")
- 输出为:
密码123456,用户名admin, sha1组合加密后为:cd5ea73cd58f827fa78eef7197b8ee606c99b2e6
SHA256加密
- SHA256比SHA1更安全,但是效率慢,结果也会长一些;
- 用户名和密码拼接后使用SHA256加密,实现如下:
def test_sha256(self): data = self.name + self.password sha256 = hashlib.sha256() sha256.update(data.encode("utf-8")) sha1_pass = sha256.hexdigest() print(f"密码{self.password},用户名{self.name}, sha256组合加密后为:{sha1_pass}")
- 输出为:
密码123456,用户名admin, sha256组合加密后为:ac0e7d037817094e9e0b4441f9bae3209d67b02fa484917065f71b16109a1a78
- 当然还有SHA512这个就不说了,同理可证。
HMAC加密
- 其实这个我自动化过程中用的不多,但是也是很常见的一个加密算法了;
- HMAC是一种基于加密hash函数和共享密钥的消息认证协议;
- 需要用到hmac库,目录在:
X:\Python37\Lib\hmac.py
- 有三个参数,一个是密钥,一个是待加密的字符串,一个是hash函数,示例如下:
def test_hmac(self): hm = hmac.new(b'029-11111111', bytes(self.password, 'utf-8'), hashlib.md5) hm.digest() hmac_pass = hm.hexdigest() print(f"密码{self.password},用户名{self.name}, hmac加密后为:{hmac_pass}")
- 输出为:
密码123456,用户名admin, hmac加密后为:4e32d965d8965df4c7f6aaaf68791e86
其他的算法
- 当然后还有几个算法,这个不再赘述了,比如DES、AES、RSA、ECC等等
- 后续有空再补充吧。
本文源码
# -*- coding:utf-8 -*- # 作者:虫无涯 # 日期:2023/12/1 # 文件名称:test_pass.py # 作用:常用的加密算法实现 # 联系:VX(NoamaNelson) # 博客:https://blog.csdn.net/NoamaNelson import hashlib import hmac class TestPass(): def __init__(self): super(TestPass, self).__init__() self.name = "admin" self.password = "123456" def test_md5(self): md = hashlib.md5(self.password.encode()) md5_pass = md.hexdigest() print(f"密码{self.password}, md5直接加密后为:{md5_pass}") def test_md5_01(self): data = (self.name + self.password).lower() md = hashlib.md5(data.encode()) md5_pass = md.hexdigest() print(f"密码{self.password},用户名{self.name}, md5组合加密后为:{md5_pass}") def test_md5_02(self): s = self.password[:5] # 设置盐 md = hashlib.md5((self.password + s).encode()) md5_pass = md.hexdigest() print(f"密码{self.password},md5加盐后为:{md5_pass}") def test_md5_03(self): s = self.password[:6] # 设置盐 md = hashlib.md5((self.password.join(s)).encode()) md5_pass = md.hexdigest() print(f"密码{self.password},md5加盐使用json方法为:{md5_pass}") def test_sha1(self): data = self.name + self.password sha1 = hashlib.sha1() sha1.update(data.encode("utf-8")) sha1_pass = sha1.hexdigest() print(f"密码{self.password},用户名{self.name}, sha1组合加密后为:{sha1_pass}") def test_sha256(self): data = self.name + self.password sha256 = hashlib.sha256() sha256.update(data.encode("utf-8")) sha1_pass = sha256.hexdigest() print(f"密码{self.password},用户名{self.name}, sha256组合加密后为:{sha1_pass}") def test_hmac(self): hm = hmac.new(b'029-11111111', bytes(self.password, 'utf-8'), hashlib.md5) hm.digest() hmac_pass = hm.hexdigest() print(f"密码{self.password},用户名{self.name}, hmac加密后为:{hmac_pass}") if __name__ == "__main__": test_pass = TestPass() # test_pass.test_md5() # test_pass.test_md5_01() # test_pass.test_md5_02() # test_pass.test_md5_03() # test_pass.test_sha1() # test_pass.test_sha256() test_pass.test_hmac()

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Sermant:无代理服务网格架构解析及无门槛玩转插件开发
本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者: 华为云社区精选 。 本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计角度介绍了Sermant的类加载器架构和插件化机制,并在实战中从基础能力开发,到进阶使用统一动态配置能力、统一日志能力一步步完成插件开发。 Sermant核心机制——插件化 Sermant分为两层,Sermant框架层和Sermant服务治理层,Sermant框架提供了一系列的API用于插件开发者可以快速进行服务治理插件的开发。 服务治理层是由多种不同的服务治理能力组成,包含流量控制、标签路由等都是被包装在不同的插件中。其中还包括Backend可用于一些状态展示和事件监控管理。 Sermant的插件化机制中得益于Java 的SPI机制,在很多高可扩展的的项目中,都会利用SPI去加载自己的扩展,Sermant在框架中定义插件声明接口,用于加载不同的服务治理插件,插件开发者只需要按照接口契约,...
- 下一篇
GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复
本文分享自华为云社区《GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复》,作者: GaussDB 数据库。 技术背景 当业务发生数据损毁、数据丢失、数据误删除等一系列故障场景时,往往需要数据库恢复到故障发生前的某一个时刻,且恢复的颗粒度越小越好。而传统数据库采取周期性备份的方式进行数据恢复时,只能恢复到备份的时间点。由于备份点有限,无法进行更细粒度的时间点恢复,非常影响用户体验。 华为云数据库GeminiDB是一款基于华为自主研发的计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库。GeminiDB Cassandra接口在综合备份成本、恢复时效和粒度得到充分验证的情况下,推出新特性PITR(Point-In-Time-Recover)支持任意时间点恢复,可以自由选择需要恢复的时间点,从而保障用户数据一致性可靠性与安全性! 实现原理 整体备份周期 一个完整的备份周期 = 1次全量数据备份 + 定期运行的增量日志备份 + 穿插运行的差异备份(根据业务读写模型进行调整频率)。 全量备份 PITR支持任意时间点恢复性能的实现,一部分依赖一次全量...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题