密码加密:md5/sha1 +盐值

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

MD5与SHA1都是Hash算法,MD5输出是128字节的,SHA1输出是160字节的,MD5比SHA1快,SHA1比MD5强度高。

 

根据上述常见的加密算法,测试人员在测试不同的加密接口可采用下述的方法处理加密接口

摘要算法(MD5.SHA1 ):造接口数据前调用MD5,SHA1进行编码,服务端对比编码后的字符串是否一致

对称加密算法(AES,DES ):造接口数据前从开发获取对称公钥,基于对称公钥可以加密请求数据,解密响应报文

非对称加密算法(RSA):造接口数据前从开发获取公钥私钥去加密解密接口数据

用户认证:一般的接口测试工具都会提供一个User Auth/Authorization的选项

 

密码不加密的话,打开开发者模式(f12)就可以轻易看到密码。

登录网站的用户名密码数据库是不会以明文密码进行存储的,如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。

采用MD5存储口令是否就一定安全呢?也不一定。假设你是一个黑客,已经拿到了存储MD5口令的数据库,如何通过MD5反推用户的明文口令呢?暴力破解费事费力,真正的黑客不会这么干。考虑这么个情况,很多用户喜欢用123456888888password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

 

import hashlib #导入hashlib模块

md5 = hashlib.md5() #获取一个md5加密算法对象
md5.update('111111aa'.encode('utf-8')) #制定需要加密的字符串
print(md5.hexdigest()) #获取加密后的16进制字符串 

得到如下:e5ccc8270cd29ba187ddde8f864438ee

需要注意的是,字符串后面要加个.encode(‘utf-8’),因为hashlib是对二进制进行加密的,如果直接对字符串加密的话, 会报错的。因此需要通过encode将字符串转码成二进制格式。

 

(补充:

 

print(md5.hexdigest())     十六进制,输出的是字母跟数字组合,用户看的懂,所以会转换成十六进制的显示密码
print(md5.digest()) 二进制

e5ccc8270cd29ba187ddde8f864438ee
b"\xe5\xcc\xc8'\x0c\xd2\x9b\xa1\x87\xdd\xde\x8f\x86D8\xee"

 

encode是编码

decode是解码)

 

 

sha1同理:

sha1 = hashlib.sha1()
# sign_str = "111111"
# sign_bytes_utf8 = sign_str.encode()
# sha1.update(sign_bytes_utf8)
# sign_sha1 = sha1.hexdigest()
# print(sign_sha1)

接口处理的时候,先把用例里面的明文密码进行加密处理(md5+盐(登陆名+固定字符)/sha1+盐(登陆名+固定字符)),得出密文,再拿这个密文跟数据库里的进行比对,是否一致。
所以做之前要先问下开发数据库里的密码是怎么加密的,来选择相应的方法设计自动化
posted @ 2021-03-06 11:10  一只测试小菜鸡  阅读(1387)  评论(0编辑  收藏  举报