hashlib模块(摘要算法)
hashlib(1)
# hashlib模块 # 现在写登录认证的时候,需要保存用户名和密码,用户名和密码是保存在文件中,并且都是明文,一旦丢了就完蛋了。所以 # 可以用hashlib将密码转换成密文的形式存储,当用户在次输入密码时,hashlib后对之前存储的hashlib值比较即可 # 对同样的值进行hashlib,hashlib的值不会变 # hashlib做的事情 # 比如有两个字符串,各有500W个字,但经过hashlib后,两个字符串中有一个字符不一样,则结果就不一样 # 摘要算法,不管使用什么样的算法,是md5还是sha,使用hashlib的方法不会变 # md5 # 一般情况用的都是md5,比较普遍 # shax # 同样的字符串被hashlib后产生的数值是永远不会变得 # 用在的场景 # 密码的密文存储 # 文件的一致性验证,校验两个文件是否一致,文件传输中常用 # 在下载的时候 检查我们下载的文件和远程的文件是否一致 # 两台机器上的两个文件 你想检查这两个文件是否相同,常用在检查集群服务器下,怀疑某个服务器机器与其他服务器机器不一样的情况,可使用这种摘要算法进行检查 import hashlib md5_1 = hashlib.md5() # 创建一个md5对象 md5_1.update(b\'alex3714\') # 对alex3714进行md5的摘要算法 print(md5_1.hexdigest()) # aee949757a2e698417463d47acac93df # 得到密文值 # 用户注册 # 用户输入用户名 # 用户输入密码 # 明文的密码进行摘要算法md5,拿到一个密文的密码 # 将密文密码和用户名写入文件 # 用户登录 # 用户输入登录名和密码 # 拿到用户的密码 # 对用户输入的密码进行摘要算法md5 # 从存储密文密码和用户的文件中找到该用户对应的密码 # 比较本次用户输入的密码,摘要后的密文密码是否与用户注册时的密文密码是否一致 import hashlib usr = input(\'username\') pwd = input(\'pwd\') with open(\'userinfo\') as f: for line in f: user, password = line.split(\'|\') md5 = hashlib.md5() md5.update(bytes(pwd, encoding=\'utf-8\')) md5_pwd = md5.hexdigest() if usr == user and md5_pwd == password: print(\'登录成功\')
hashlib(2)
# md5的撞库 # 将所有的可能性的值算出后进行md5算出密文存储在库中,给一个md5值后,被库中的MD5值匹配上了,得到了实际的明文叫做撞库 # 加盐, 加盐的方式可以解决md5的撞库问题 # 动态加盐:使用用户名的一部分和密码的一部分进行加盐 import hashlib md5_1 = hashlib.md5(b\'salt\') # 创建一个md5对象,并且加盐 md5_1.update(b\'alex3714\') # 对alex3714进行md5的摘要算法 print(md5_1.hexdigest()) # 29520817dd17b99ea7af32890f7698f # 得到密文值 与不加盐的不一样了 # 总结: # hashlib 做摘要计算的,把字节类型的内容进行摘要处理 # 摘要算法有 md5 、sha等 # md5 # 正常的md5算法 # 加盐的md5 # 动态加盐的md5 # 文件的一致性校验中,md5 不需要一般不需要加盐处理 # 整体对alex3714进行摘要和分开对alex3714进行摘要结果是一样的 # md5.update(r\'alex\') + md5.update(r\'3714\') = md5.update(r\'alex3714\')
版权声明:本文为whylinux原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。