在自动化测试时,Python 常用的几个加密算法

发表于:2024-1-10 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:虫无涯    来源:网络

  写在前边
  这几天做自动化测试,遇到一个问题,那就是接口的请求的密码是加密的;
  产品的要求是不能使用其他特殊手段,他给提供加密算法,需要在接口请求的时候,使用加密算法处理后的数据传参;
  其实这样来说反而简单了很多,因为已经知道加密算法,那就在传参前先把密码进行加密处理就行了(心理默默的想,这个产品也太好了吧);
  本文主要是整理了几个加密算法,以便后续测试使用。
  公用数据
  为了方便后续举例,我们设计一个类,来把需要演示的加密算法统一封装起来:
  # -*- 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()
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号