hashlib和hmac模塊


一、hashlib模塊

1.0.1 hash是什么

hash是一種算法(Python3.版本里使用hashlib模塊代替了md5模塊和sha模塊,主要提供 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 算法),該算法接受傳入的內容,經過運算得到一串hash值。

hash值的特點:

  1. 只要傳入的內容一樣,得到的hash值一樣,可用於非明文密碼傳輸時密碼校驗
  2. 不能由hash值返解成內容,即可以保證非明文密碼的安全性
  3. 只要使用的hash算法不變,無論校驗的內容有多大,得到的hash值長度是固定的,可以用於對文本的哈希處理

hash算法其實可以看成如下圖所示的一座工廠,工廠接收你送來的原材料,經過加工返回的產品就是hash值

hashlib模塊

import hashlib
m = hashlib.md5()

m.update('hello'.encode('utf8'))
print(m.hexdigest())
5d41402abc4b2a76b9719d911017c592
m.update('hash'.encode('utf8'))
print(m.hexdigest())
97fa850988687b8ceb12d773347f7712
m2 = hashlib.md5()
m2.update('hellohash'.encode('utf8'))
print(m2.hexdigest())
97fa850988687b8ceb12d773347f7712
m3 = hashlib.md5()
m3.update('hello'.encode('utf8'))
print(m3.hexdigest())
5d41402abc4b2a76b9719d911017c592

1.0.2 撞庫破解hash算法加密

hash加密算法雖然看起來很厲害,但是他是存在一定缺陷的,即可以通過撞庫可以反解,如下代碼所示。

import hashlib

# 假定我們知道hash的微信會設置如下幾個密碼
pwd_list = [
    'hash3714',
    'hash1313',
    'hash94139413',
    'hash123456',
    '123456hash',
    'h123ash',
]


def make_pwd_dic(pwd_list):
    dic = {}
    for pwd in pwd_list:
        m = hashlib.md5()
        m.update(pwd.encode('utf-8'))
        dic[pwd] = m.hexdigest()
    return dic


def break_code(hash_pwd, pwd_dic):
    for k, v in pwd_dic.items():
        if v == hash_pwd:
            print('hash的微信的密碼是===>%s' % k)


hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2'
break_code(hash_pwd, make_pwd_dic(pwd_list))
hash的微信的密碼是===>hash123456

為了防止密碼被撞庫,我們可以使用python中的另一個hmac 模塊,它內部對我們創建key和內容做過某種處理后再加密。

如果要保證hmac模塊最終結果一致,必須保證:

  1. hmac.new括號內指定的初始key一樣
  2. 無論update多少次,校驗的內容累加到一起是一樣的內容
import hmac

# 注意hmac模塊只接受二進制數據的加密
h1 = hmac.new(b'hash')
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())
905f549c5722b5850d602862c34a763e
h2 = hmac.new(b'hash')
h2.update(b'helloworld')
print(h2.hexdigest())
905f549c5722b5850d602862c34a763e
h3 = hmac.new(b'hashhelloworld')
print(h3.hexdigest())
a7e524ade8ac5f7f33f3a39a8f63fd25


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM