在自动化测试时,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()

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

相关推荐
豌豆花下猫3 分钟前
Python 潮流周刊#102:微软裁员 Faster CPython 团队(摘要)
后端·python·ai
yzx99101335 分钟前
Gensim 是一个专为 Python 设计的开源库
开发语言·python·开源
麻雀无能为力1 小时前
python自学笔记2 数据类型
开发语言·笔记·python
Ndmzi1 小时前
matlab与python问题解析
python·matlab
懒大王爱吃狼1 小时前
怎么使用python进行PostgreSQL 数据库连接?
数据库·python·postgresql
猫猫村晨总1 小时前
网络爬虫学习之httpx的使用
爬虫·python·httpx
web150854159351 小时前
Python线性回归:从理论到实践的完整指南
python·机器学习·线性回归
ayiya_Oese1 小时前
[训练和优化] 3. 模型优化
人工智能·python·深度学习·神经网络·机器学习
抽风的雨6101 小时前
【python基础知识】Day 27 函数专题2:装饰器
开发语言·python
漫谈网络3 小时前
Python logging模块使用指南
python·logging·日志