一、hashlib模块
1.概述
(1)hashlib提供了常见的摘要算法,如MD5、SHA1等等
(2)摘要算法:又称为哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
2.常用的方法
(1)md5()/sha1():创建一个md5或者sha1加密模式的hash对象
(2)update(arg):用字符串参数来更新hash对象,如果同一个hash对象重复调用该方法
如:m.update(a);m.update(b) 则等于 m.update(a+b)
(3)digest():返回摘要,作为二进制数据字符串值
(4)hexdigest():返回摘要,作为十六进制数据字符串值
(5)copy():复制
3.常用的属性
(1)algorithms:列出所有加密算法
(2)digest_size:产生散列的字节大小
4、md5/shar1示例
(1)计算出一个字符串的MD5值
①代码
import hashlib
md5_ = hashlib.md5() # 创建一个md5对象(md5_)
md5_1 = hashlib.md5() # 创建一个md5对象(md5_1)
md5_2 = hashlib.md5() # 创建一个md5对象(md5_2)
md5_.update("suner yao hao hao xue xi".encode())
print("md5_的字符串值:", md5_.hexdigest())
md5_1.update("123456".encode())
print("md5_1的字符串值:", md5_1.hexdigest())
# 数据量很大,可以分块多次调用update()
md5_2.update("suner".encode())
md5_2.update("hao hao xue xi".encode())
print("md5_2的字符串值:", md5_2.hexdigest())
②结果
(2)计算出一个字符串的SHA1值,与MD5一致
①代码
import hashlib
sha1_= hashlib.sha1() # 创建一个sha1对象(sha1_)
sha1_1 = hashlib.sha1() # 创建一个sha1对象(sha1_1)
sha1_2 = hashlib.sha1() # 创建一个sha1对象(sha1_2)
sha1_.update("suner yao hao hao xue xi".encode())
print("sha1_的字符串值:", sha1_.hexdigest())
sha1_1.update("123456".encode())
print("sha1_1的字符串值:", sha1_1.hexdigest())
# 数据量很大,可以分块多次调用update()
sha1_2.update("suner".encode())
sha1_2.update("hao hao xue xi".encode())
print("sha1_2的字符串值:", sha1_2.hexdigest())
②结果
比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
三、摘要算法
1.应用场景(常用例子)
任何允许用户登录的网站都会存储用户登录的用户名和口令。方法是存放数据库表中
口令(比如密码)如果以铭文保存,一旦数据库泄露,信息就全部泄露了
2.用户登录示例
(1)代码
import hashlib
user_info = {"name":"suner", "password":"e10adc3949ba59abbe56e057f20f883e"}
class User_login():
def __init__(self,name,password):
self.name = name
self.password = password
def login(self):
md5_ = hashlib.md5() # 创建一个md5对象
md5_.update(self.password.encode("utf-8"))
password = md5_.hexdigest() # 转为字符串显示
if self.name == user_info["name"] and user_info["password"] == password: # 判断用户名和密码都正确才算成功
print("登录成功")
else:
print("密码或账号有误")
if __name__ == '__main__':
name = input("请输入用户名:")
password = input("请输入密码:")
user_login = User_login(name, password)
user_login.login()
(2)结果