本文分享自华为云社区《『加密算法』| 自动化测试时基于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()

点击关注,第一时间了解华为云新鲜技术~

在自动化测试时,Python常用的几个加密算法,你有用到吗的更多相关文章

  1. Python常用模块-摘要算法(hashlib)

    Python常用模块-摘要算法(hashlib) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MD5算法参数详解 1.十六进制md5算法摘要 #!/usr/bin/env p ...

  2. pytest框架执行自动化测试时使用pycharm正常运行,使用cmd或Terminal报错:Hint: make sure your test modules/packages have valid Python names.

    问题描述: 使用pytest框架做接口自动化测试时,在测试用例所在的.py文件下使用pycharm的run功能可以正常跑用例,使用cmd运行窗口或Terminal则报下图中的错误: Hint: mak ...

  3. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  4. Python常用的标准库以及第三方库

    Python常用的标准库以及第三方库有哪些?   20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们 ...

  5. 五大自动化测试的Python框架

    1.Robot Framework 作为最重要的Python测试框架之一,Robot Framework主要被用在测试驱动(test-driven)类型的开发与验收中.虽然是由Python开发而来,但 ...

  6. Python 常用string函数

    Python 常用string函数 字符串中字符大小写的变换 1. str.lower()   //小写>>> 'SkatE'.lower()'skate' 2. str.upper ...

  7. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  8. Python常用内建模块

    Python常用内建模块 datetime 处理日期和时间的标准库. 注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import da ...

  9. python——常用模块2

    python--常用模块2 1 logging模块 1.1 函数式简单配置 import logging logging.debug("debug message") loggin ...

  10. python——常用模块

    python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...

随机推荐

  1. chatglm2-6b模型在9n-triton中部署并集成至langchain实践

    一.前言 近期, ChatGLM-6B 的第二代版本ChatGLM2-6B已经正式发布,引入了如下新特性: ①. 基座模型升级,性能更强大,在中文C-Eval榜单中,以51.7分位列第6: ②. 支持 ...

  2. JNDI注入的本地搭建和分析

    JNDI注入的本地搭建和分析   JNDI概述 JNDI(The java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (81)-- 算法导论7.4 6题

    六.如果用go语言,考虑对 PARTITION 过程做这样的修改:从数组 A 中随机选出三个元素,并用这三个元素的中位数(即这三个元素按大小排在中间的值)对数组进行划分.求以a 的函数形式表示的.最坏 ...

  4. Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

    JNDI注入 什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统 ...

  5. BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题

    四.用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢. 文心一言: 在 Go 语言中,我们可以使用切片来实现队列.下面是如何实现 ENQUEUE 和 DEQUE ...

  7. Go语言常用标准库——log、net_http、strconv、time包

    文章目录 log 使用Logger 配置logger 标准logger的配置 flag选项 配置日志前缀 配置日志输出位置 创建logger 总结 net_http net/http介绍 HTTP协议 ...

  8. 爽。。。一键导出 MySQL 表结构,告别手动梳理表结构文档了。。。

    背景 系统需要交付,客户要求提供交维材料,包括系统的表结构,安排开发人员进行梳理,效率比较慢,遂自己花点时间捣鼓一下,发现有此插件,记录一下方便与同事分享 前提条件 必须有 go语言环境,有的话直接看 ...

  9. 俄罗斯版IDM安装与破解以及解决B站视频网站不弹出下载浮窗

    IDM 全称 Internet Download Manager,是一款非常优秀的多线程下载和视频嗅探工具,不仅可以显著提高文件下载速度,配合IDM浏览器扩展插件,还可以嗅探并下载YouTube.知乎 ...

  10. 手撕Vue-查找指令和模板

    接着上一篇文章,我们已经实现了提取元素到内存的过程,接下来我们要实现的是查找指令和模板. 大致的思路是这样的: 遍历所有的节点 需要判断当前遍历到的节点是一个元素还是一个文本 如果是一个元素, 我们需 ...