天天看點

Python子產品-hashlib

1.hashlib的簡介

  hashlib 是一個提供了一些流行的hash(摘要)算法的Python标準庫.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等

  什麼是摘要算法呢?摘要算法又稱雜湊演算法、雜湊演算法。它通過一個函數,把任意長度的資料轉換為一個長度固定的資料串(通常用16進制的字元串表示)。更多請看:​​hashlib — 安全哈希與消息摘要​​

2.hashlib的使用

  本文以hashlib中MD5算法為例,其他的sha224、sha256算法用法和MD5基本一緻。

2.1 常用屬性

hashlib.algorithms
#列出所有加密算法

h.digest_size
#産生的散列位元組大小。

h.block_size
#哈希内部塊的大小      

2.2 常用方法

hash.new([arg])
# 建立指定加密模式的hash對象

hash.update(arg)
# 更新哈希對象以字元串參數。如果同一個hash對象重複調用該方法,m.update(a); m.update(b) 等價于 m.update(a+b)

hash.digest()
# 傳回摘要,作為二進制資料字元串值。

hash.hexdigest()
# 傳回摘要,作為十六進制資料字元串值

hash.copy()
# 複制      

2.3 使用示例

# MD5 的使用
#其它的sha1,sha256就是加密函數不一樣,其餘基本相同,這裡就不示範了
import hashlib

def jm_md5(password):
    m = hashlib.md5()  # 建構MD5對象
    m.update(password.encode(encoding='utf-8')) #設定編碼格式 并将字元串添加到MD5對象中
    password_md5 = m.hexdigest()  # hexdigest()将加密字元串 生成十六進制資料字元串值
    return password, password_md5
    
g = jm_md5('123456')
print(g)

#結果輸出:
('123456', 'e10adc3949ba59abbe56e057f20f883e')      

3.hashlib的特點

  1、摘要算法在很多地方都有廣泛的應用。

  2、要注意摘要算法不是加密算法,不能用于加密(因為無法通過摘要反推明文),隻能用于防篡改。

  3、它的單向計算特性決定了可以在不存儲明文密碼的情況下驗證使用者密碼。

  一個優秀的 hash 算法,将能實作:

  正向快速:給定明文和 hash 算法,在有限時間和有限資源内能計算出 hash 值。

  逆向困難:給定(若幹) hash 值,在有限時間内很難(基本不可能)逆推出明文。

  輸入敏感:原始輸入資訊修改一點資訊,産生的 hash 值看起來應該都有很大不同。

  沖突避免:很難找到兩段内容不同的明文,使得它們的 hash 值一緻(發生沖突)。即對于任意兩個不同的資料塊,其hash值相同的可能性極小;對于一個給定的資料塊,找到和它hash值相同的資料塊極為困難。

4.實際示範

4.1 基本示範

import hashlib

# 一、在建構對象直接插入加密字元串
m1 = hashlib.md5('hello python'.encode(encoding='utf-8'))  # 建構MD5對象
print(m1.hexdigest())   # 結果為: e53024684c9be1dd3f6114ecc8bbdddc


# 二、通過update方法 往MD5對象中增加字元串參數
m2 = hashlib.md5()  # 建構MD5對象
m2.update('hello python'.encode(encoding='utf-8')) # 設定編碼格式 并将字元串添加到MD5對象中
password_md5 = m2.hexdigest()
print(m2.hexdigest())   # 結果為 e53024684c9be1dd3f6114ecc8bbdddc


# 三、當資料量過過大時,可以分塊摘要,例如:
m3 = hashlib.md5()
m3.update("hello ".encode("utf-8"))  # 注意:分塊是空格也要保持一緻
m3.update("python".encode("utf-8"))
print(m3.hexdigest())  # 結果為:e53024684c9be1dd3f6114ecc8bbdddc

# MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit位元組,通常用一個32位的16進制字元串表示。      

  三種方式,往構造的MD5對象中傳參,隻要傳參的字元串一緻,最後生成的結果是一樣的。

  這說明hash算法就像一座工廠,工廠接收你送來的原材料(可以用m.update()為工廠運送原材料),經過加工傳回的産品就是hash值。這也是摘要算法的一個特點,它不是加密算法,不能用于加密(因為無法通過摘要反推明文),隻能用于防篡改。

4.2 應用場景案例

  hashlib子產品主要應用于,使用者賬号密碼登入,對明文密碼進行加密等

import hashlib

USER_LIST = []
def pwd_Md5(password):
    password = password+'hello python'  # 字元串混淆加鹽,可以設定更複雜一點
    return hashlib.md5(password.encode("utf-8")).hexdigest()


def register():
    print('**************使用者注冊**************')
    while True:
        user = input('請輸入使用者名:')
        if user.isalpha():
            break
    while True:
        password1 = input('請輸入密碼>>>:').strip()
        passwprd2 = input('請重複密碼>>>:').strip()
        if password1 == passwprd2:
            password = pwd_Md5(password1)  # 将密碼進行Md5加密
            break
        else:
            print('密碼不正确,重新輸入!')
    temp = {'username':user,'password':password}
    USER_LIST.append(temp)


def login():
    print('**************使用者登陸**************')
    user = input('請輸入使用者名:')
    pwd = input('請輸入密碼:')

    for item in USER_LIST:  
        if item['username'] == user and item['password'] == pwd_Md5(pwd):
            return True

if __name__=='__main__':

    register()
    if login():
        print('登陸成功')
    else:
        print('登陸失敗')

#結果輸出:
**************使用者注冊**************
請輸入使用者名:lizexiong
請輸入密碼>>>:123456
請重複密碼>>>:123456
**************使用者登陸**************
請輸入使用者名:lizexiong
請輸入密碼:123456
登陸成功      

  1、使用者登入需要使用密碼,密碼一定要加密,保證使用者的資訊安全。

    1)加密可以使用hashlib子產品進行加密。

    2)加密可以寫成加密函數,友善多處調用

    3)提高密碼解密的複雜性,代碼中多加字元串。(加密算法雖然依然非常厲害,但是也存在缺陷,即:通過撞庫可以反解。是以,有必要對加密密碼進行加鹽。)

作者:小家電維修