# python的hashlib提供了常见的摘要算法,如md5(md5算法),sha1等等。摘要:digest # 摘要算法又称哈希算法、散列算法。 # 它通过一个函数,把任意长度的数据(明文)转换为一个长度固定的数据串(密文)(通常用16进制的字符串表示)。 # 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest, # 目的是为了发现原始数据是否被人篡改过。摘要算法之所以能指出数据是否被篡改过, # 就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。 # 而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。 # 要注意摘要算法虽然可以用于加密,但网上有很多可以解密的网站,存在一定的被破解的风险。 # 一个明文对应唯一密文。常用于对比登录密码和存储在电脑的密码或网站密码(文件的一致性校验)。 # 如果以明文保存用户口令(用户名或密码),如果数据库泄露,所有用户的口令就落入黑客的手里。黑客撞库。 # 此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。 # 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如md5 # 1. import hashlib md5 = hashlib.md5()#md5可改为sha1,比sha1更安全的算法是sha256和sha512,不过越安全的算法越慢,而且摘要长度更长。 md5.update(b'136320') #b'136320'相当于'136320'.encode('utf-8')。 print(md5.hexdigest())#d5d082d2642302fae506350fff337632,这是md5值,一个32位的16进制字符串。 # 2.如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的: import hashlib md5 = hashlib.md5() md5.update(b'13') md5.update(b'6320')#13跟6320叠加的md5值跟136320的md5值是一样的。 print(md5.hexdigest())#d5d082d2642302fae506350fff337632 # md5.update(b'136320') # print(md5.hexdigest())#d5d082d2642302fae506350fff337632 # 3. 用户注册,密码是md5值: import hashlib username = input('username:') password = input('password:') md5 = hashlib.md5() #获取md5对象 md5.update(bytes(password,encoding = 'utf-8')) #加密:md5.update密码。password.encode('utf-8') md5_pwd = md5.hexdigest() #获取md5值(密文) with open('username&password',mode = 'w',encoding = 'utf-8') as f: f.write('%s&%s'%(username,md5_pwd)) # 4. 用户登录验证: import hashlib username = input('username:') password = input('password:') with open('username&password',encoding = 'utf-8') as f: for line in f: user,pwd = line.split('&') md5 = hashlib.md5() md5.update(bytes(password,encoding='utf-8')) #要写上encoding='utf-8',不然会抛出string argument without an encoding md5_pwd = md5.hexdigest() if username == user and md5_pwd == pwd: print('登录成功') else: print('账户或密码不对') # 5. 加盐:经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令,但也存在一定的被破解的风险。 import hashlib md5 = hashlib.md5(bytes('salt',encoding = 'utf-8'))#salt可以是任意字符。 md5.update(b'136320') print(md5.hexdigest())#dc740385c07799eefb7c1f1ae24050ee # 加了盐之后,md5值跟原来的d5d082d2642302fae506350fff337632不一样。 #盐后面还可以加其他字符:b'123' import hashlib md5 = hashlib.md5(bytes('salt',encoding = 'utf-8') + b'123') md5.update(b'136320') print(md5.hexdigest())