魔力Python---hashlib

1 什么是hashlib?

hashlib主要提供字符加密功能,包括md5,sha1,sha256,sha512,sha224,sha384算法(md5已经被破解,后两种不经常使用)

哈希算法也称为摘要算法,相同的数据始终得到相同的输出,不同的数据得到不同的输出.
(1)哈希将不可变的任意长度的数据编程具有固定长度的唯一值.
(2)字典的键值对映射关系是通过哈希计算的,哈希存储的数据是散列的(无序)

应用场景:校验(账号密码校验,文件一致性校验)

2 hashlib使用

2.1 hashlib属性和方法

algorithms:列出所有加密算法('md5','sha1','sha224','sha256','sha384','sha512')
digesti_size:产生的散列的字节大小
md5()/sha1():创建一个md5或者sha1加密模式的hash对象
update(arg):用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b)
digest():返回摘要,作为二进制数据字符串值
hexdigest():返回摘要,作为十六进制数据字符串值
copy():复制

2.2 hashlib使用简例

以md5算法为例

#引包
import hashlib

def md5():
    #创建一个md5算法的对象(可加盐)
    hashlib_obj = hashlib.md5()
    #若想加盐写hashlib_obj = hashlib.md5('abcd'.encode())
    #print(hashlib_obj)
    hashlib_obj.update('123'.encode())
    #123属于想要被加盐的对象,update中的参数必须是二进制字节流
    return hashlib_obj.hexdigest()
    #hexdigest返回32位十六进制的字符串(固定长度)

一般加盐之后密码安全性大大提高,只有穷举法才能破解.

3 hashlib实例

3.1 登录验证

import hashlib
#定义一个加密函数,将传入的参数转换成32位的哈希值并返回
def md5(pwd):
  md5_password = hashlib.md5("abd".encode())
  md5_password.update(pwd.encode())
  return md5_password.hexdigest()
#定义一个登录函数,将传入的账号密码与本地密码文件进行匹配,如果匹配到返回True
def login(user,pwd):
  with open("database","r",encoding="utf-8") as fp:
    for line in fp :
      u,p = line.strip().split("|")
      if u == user and p == md5(pwd):
        return True
#定义一个注册的函数,将用户传入的账号密码写入到本地的密码文件中
def register(user,pwd):
  with open("database","w",encoding="utf-8") as fp:
    temp = user+ "|" + md5(pwd)
    fp.write(temp)
#index菜单,给用户的交互
choice = input("1表示登录, 2表示注册:").strip()
if choice == "2":
  user = input("用户名:")
  pwd = input("密码:")
  register(user,pwd)
elif choice == "1":
  user = input("用户名:")
  pwd = input("密码:")
  r = login(user,pwd)
  if r == True:
    print("登录成功")
  else:
    print("登录失败")
else:
  print("账号不存在")

3.2 文件比较一致性

import hashlib


def out_md5(src):
  # 简单封装
  m = hashlib.md5()
  m.update(src.encode('utf-8'))
  return m.hexdigest()


with open('1.txt', 'r') as f:
  src = f.read()
  m1 = out_md5(src)
  print(m1)

with open('2.txt', 'r') as f:
  src = f.read()
  m2 = out_md5(src)
  print(m2)

if m1 == m2:
  print(True)
else:
  print(False)

记得,最后输出的是如此,所以文件输出的是一串数字.(参考补充,sha1适用的二进制长度相当大,不要担心被使用完)

bb0c1b519a0a2b8e6c74703e44538c60
43cb091db43a710d85ce45fb202438cd
False

4 补充

md5和sha类算法一样写法.

sha系列中的sha1, sha224, sha2556适用于长度不超过264二进制位的消息。sha384和sha512适用于长度不超过2128二进制位的消息。

现在sha256以上相对安全.

posted on 2019-06-21 18:26  流云封心  阅读(63)  评论(0)    收藏  举报