密码加密:md5sha1+盐值
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反推⽤户的明⽂⼝令呢?暴⼒破解费事费⼒,真正的⿊客不会这么⼲。考虑这么个情况,很多⽤户喜欢⽤123456,888888,password这些简单的⼝令,于是,⿊客可以事先计算出这些常⽤⼝令的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 = de()
# sha1.update(sign_bytes_utf8)
# sign_sha1 = sha1.hexdigest()
# print(sign_sha1)
接⼝处理的时候,先把⽤例⾥⾯的明⽂密码进⾏加密处理(md5+盐(登陆名+固定字符)/sha1+盐(登陆名+固定字符)),得出密⽂,再拿这个密⽂跟数据库⾥的进⾏⽐对,是否⼀致。所以做之前要先问下开发数据库⾥的密码是怎么加密的,来选择相应的⽅法设计⾃动化

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。