博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

hashlib模块

Posted on 2020-05-20 00:29  cxysailor  阅读(157)  评论(0)    收藏  举报

hashlib模块1. 封装一些用于加密的类:2. 加密的目的3. 特点4. 加密的使用4.1 加密的步骤4.2 md5加密方法4.3 sha1加密方法4.4 sha224加密方法4.5 sha384加密方法4.6 sha512加密方法4.7 sha3_224加密方法4.8 sha3_256加密方法4.9 sha3_384加密方法4.10 sha3_512加密方法4.11 创建加密对象时可以指定参数,称为salt5. 加密的作用6. 加密方法的区别7. 一个综合利用的小例子

hashlib模块

1. 封装一些用于加密的类:

'md5', 'pbkdf2_hmac', 'scrypt', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256'

2. 加密的目的

用于判断和验证,并非用于解密

3. 特点

  • 把一个大的数据,切分成不同的块进行加密,再汇总的结果,与直接对整体数据加密的结果是一致的

     1  """切片加密再汇总与直接整体加密结果一致"""
     2  import hashlib
     3  4  # 将abcdef切片为abc和def加密
     5  m = hashlib.md5()
     6  m.update(b'abc')
     7  m.update(b'def')
     8  9  # 直接将abcdef整体加密
    10  n = hashlib.md5()
    11  n.update(b'abcdef')
    12 13  print(m.hexdigest())
    14  print(n.hexdigest())
    15  # 输出结果一致
    16  e80b5017098950fc58aad83c8c14978e
    17  e80b5017098950fc58aad83c8c14978e

     

     

  • 单向加密,不可逆

  • 原始数据的一点小的变化,将导致结果的非常大的差异 - 雪崩效应

     1  import hashlib
     2  3  # 获取一个md5加密对象
     4  m = hashlib.md5()
     5  m.update(b'abc')
     6  7  n = hashlib.md5()
     8  n.update(b'ab c')  # 包含一个空格
     9 10  print(m.hexdigest())
    11  print(n.hexdigest())
    12  # 输出结果 - 相差很大
    13  900150983cd24fb0d6963f7d28e17f72
    14  7f1f06c08b5de8a0c856f4baa7b2e6d0

     

     

4. 加密的使用

4.1 加密的步骤

  1. 获取一个加密对象

  2. 使用加密对象的update()方法进行加密,该方法可以调用多次

  3. 通常使用hexdigest()方法获取加密结果;或者digest()方法获取二进制的字节串结果

4.2 md5加密方法

 
 1 """md5加密方法"""
 2  import hashlib
 3  4  # 获取一个md5加密对象
 5  m = hashlib.md5()
 6  # 使用update()进行加密 - 必须是byte类型的数据
 7  m.update(b'abc')  # b'abc' - 将字符串abc转换成字节类型
 8  # 对于字符串中的中文处理
 9  m.update('abc中文'.encode('utf-8'))
10  # 通过hexdigest()获取加密的结果
11  res = m.hexdigest()
12  print(res)    
13  bb33ac3c7ccefffd55fabfd949dd8d49  # 输出的是字符串
14  # 通过digest()方法获取二进制的字节串结果
15  res1 = m.digest()
16  print(res1)
17  b'\xbb3\xac<|\xce\xff\xfdU\xfa\xbf\xd9I\xdd\x8dI'  # 输出的是二进制的字节串
18  print(len(res))
19  32

 

4.3 sha1加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha_1 = hashlib.sha1()
 5  # 对abc进行加密
 6  sha_1.update(b'abc')
 7  # 获取加密结果
 8  res = sha_1.hexdigest()
 9  print(res)
10  a9993e364706816aba3e25717850c26c9cd0d89d
11  print(len(res))
12  40

 

4.4 sha224加密方法

 
 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha_224 = hashlib.sha224()
 5  # 对abc进行加密
 6  sha_224.update(b'abc')
 7  # 获取加密结果
 8  res = sha_224.hexdigest()
 9  print(res)
10  23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
11  print(len(res))
12  56

 

4.5 sha384加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha_384 = hashlib.sha384()
 5  # 对abc进行加密
 6  sha_384.update(b'abc')
 7  # 获取加密结果
 8  res = sha_384.hexdigest()
 9  print(res)
10  cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
11  print(len(res))
12  96

 

4.6 sha512加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha_512 = hashlib.sha512()
 5  # 对abc进行加密
 6  sha_512.update(b'abc')
 7  # 获取加密结果
 8  res = sha_512.hexdigest()
 9  print(res)
10  ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
11  print(len(res))
12  128

 

4.7 sha3_224加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha3_224 = hashlib.sha3_224()
 5  # 对abc进行加密
 6  sha3_224.update(b'abc')
 7  # 获取加密结果
 8  res = sha3_224.hexdigest()
 9  print(res)
10  e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf
11  print(len(res))
12  56

 

4.8 sha3_256加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha3_256 = hashlib.sha3_256()
 5  # 对abc进行加密
 6  sha3_256.update(b'abc')
 7  # 获取加密结果
 8  res = sha3_256.hexdigest()
 9  print(res)
10  3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532
11  print(len(res))
12  64

 

4.9 sha3_384加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha3_384 = hashlib.sha3_384()
 5  # 对abc进行加密
 6  sha3_384.update(b'abc')
 7  # 获取加密结果
 8  res = sha3_384.hexdigest()
 9  print(res)
10  ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25
11  print(len(res))
12  96

 

4.10 sha3_512加密方法

 
 1 import hashlib
 2  3  # 获取加密对象
 4  sha3_512 = hashlib.sha3_512()
 5  # 对abc进行加密
 6  sha3_512.update(b'abc')
 7  # 获取加密结果
 8  res = sha3_512.hexdigest()
 9  print(res)
10  b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0
11  print(len(res))
12  128

 

4.11 创建加密对象时可以指定参数,称为salt

 
 1 """md5加密方法"""
 2  import hashlib
 3  4  # 获取一个md5加密对象
 5  m = hashlib.md5()
 6  n = hashlib.md5(b'abc')  # 获取加密对象时指定参数salt
 7  # 使用update()进行加密 - 必须是byte类型的数据
 8  m.update(b'abc')  # b'abc' - 将字符串abc转换成字节类型
 9  res_m = m.hexdigest()
10  print(res_m)
11  print(len(res_m))
12  res_n = n.hexdigest()
13  print(res_n)
14  print(len(res_n))
15  # 输出结果是一致的
16  900150983cd24fb0d6963f7d28e17f72
17  32
18  900150983cd24fb0d6963f7d28e17f72
19  32

 

 

5. 加密的作用

主要用于加密和验证

  • 加密:给一个数据加密

  • 验证:用另一个数据加密的结果和第一次加密的结果对比,若结果相同,说明原文相同;若结果不同,则原文不同

6. 加密方法的区别

上述各加密方法的区别主要在于加密结果的长度不同

一位16进制的字节对应4位的二进制字节(1:4)

所以各加密方法长度与二进制位的对应关系如下: 进制加密长度位进制加密长度位

加密方法16进制加密长度(bit位)2进制加密长度(bit位)
md5 32 128
sha1 40 160
sha224 56 224
sha256 64 256
sha384 96 384
sha512 128 512
sha3_224 56 224
sha3_256 64 256
sha3_384 96 384
sha3_512 128 512

7. 一个综合利用的小例子

 1  """hashlib加密验证的小例子
 2  实现如下功能:
 3  注册、登录、验证用户名和密码
 4  """
 5  import hashlib
 6  7  8  # md5加密功能
 9  def get_md5(user_name, pass_word):
10      """md5加密功能"""
11      # 获取加密对象
12      m = hashlib.md5()
13      m.update(user_name.encode('utf-8'))
14      m.update(pass_word.encode('utf-8'))
15      return m.hexdigest()
16 17 18  # 注册功能
19  def register():
20      """注册功能"""
21      # 输入用户名和密码
22      user_name = input('请输入用户名: ').strip()
23      pass_word = input('请输入密码: ').strip()
24      # 加密
25      res = get_md5(user_name, pass_word)
26      # 将加密的信息(字符串)保存到文件login
27      with open('login', mode='at', encoding='utf-8') as f:
28          f.write(res)
29          f.write('\n')
30          return True, f'用户[{user_name.title()}]注册成功!'
31 32 33  # 登录功能
34  def login():
35      """登录功能"""
36      # 输入当前要登录的用户名和密码
37      user_name = input('请输入用户名: ').strip()
38      pass_word = input('请输入密码: ').strip()
39      # 加密当前登录的用户名和密码
40      res = get_md5(user_name, pass_word)
41      # 读取文件login中保存的信息与res进行对比
42      with open('login', mode='rt', encoding='utf-8') as f:
43          for line in f:
44              if res == line.strip():
45                  return True, f'用户[{user_name.title()}]登录成功!'
46          else:
47              return False, f'用户[{user_name.title()}]不存在!'
48 49 50  # 退出程序
51  def quit_program():
52      """退出程序"""
53      quit()
54 55 56  # 函数功能字典
57  func_dic = {
58      '1': register,
59      '2': login,
60      '3': quit_program,
61  }
62 63  # 打印选择菜单
64  print("""
65  ======== 功能菜单 ========
66     1.注册
67     2.登录
68     3.退出
69  ========== END ==========
70  """)
71 72  # 主循环 - 程序入口
73  while True:
74      # 用户选择相应的功能
75      choice = input('请输入功能编号: ').strip()
76      if choice not in func_dic:
77          print('请输入正确的功能编号!')
78          continue
79      flag, msg = func_dic.get(choice)()
80      if flag:
81          print(msg)
82      else:
83          print(msg)