python模塊hashlib & hmac

Hash,譯作「散列」,也有直接音譯爲「哈希」的。把任意長度的輸入,經過某種hash算法,變換成固定長度的輸出,該輸出就是散列值,也稱摘要值。該算法就是哈希函數,也稱摘要函數。php

MD5是最多見的摘要算法,速度很快,生成結果是固定的16字節,一般用一個32位的16進制字符串表示。SHA1算法更安全點,它的結果是20字節長度,一般用一個40位的16進制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不過越安全的算法越慢,而且摘要長度更長。

python

兩個模塊主要用於加密相關的操做(加密數據時必定要指定數據編碼格式。能夠使用字符串前b' '的方法或使用.encode('UTF-8')的方法,使字符串變爲bytes類型)算法

hashlib模塊

md5安全

import hashlib
ha_m5 = hashlib.md5()#建立對象
ha_m5.update('abc'.encode(encoding='utf-8'))#添加對象時須要指定編碼
print(ha_m5.digest())#以二進制格式顯示加密信息
print(ha_m5.hexdigest())#以十六進制格式顯示加密信息(經常使用)

應用實例:app

    def md5_lower_32(dic,secret):
        """
        接口的鑑權方法
        把參數字典中value非空的鍵值對按順序進行拼接後,再加上密鑰secret進行MD5獲得sign
        """
        lis = dic.items()
        lis = sorted(lis,reverse=False)
        key_value = []
        for key,value in lis:
            if value:
                if type(value) is int:
                    value = str(value)
                elif type(value) is not str:
                    continue
                elif key == 'sign':
                    continue
                s = key+'='+value
                key_value.append(s)
        key_value.append('secret=%s'%secret)
        string = '&'.join(key_value)
        print(string)
        md = hashlib.md5()
        md.update(string.encode(encoding='utf-8'))
        ret = md.hexdigest()#以十六進制格式顯示加密信息(經常使用),md.digest()是以二進制格式顯示加密信息
        return ret

 

sha1(sha224   sha256  sha384  sha512等不做贅述)函數

ha_s1 = hashlib.sha1()
ha_s1.update('abc'.encode(encoding='utf-8'))
print(ha_s1.digest())#以二進制格式顯示加密信息
print(ha_s1.hexdigest())#以十六進制格式顯示加密信息

 hmac模塊

sha1(方法支持加鹽)測試

import hmac
key = b'salt'
data = b'sjdhjwkdjk'
hm = hmac.new(key,data,hashlib.sha1)
hm.digest()#以二進制格式顯示加密信息
hm.hexdigest()#以十六進制格式顯示加密信息

 應用實例:編碼

 
 
import hmac,base64
def sha1_base64(key,data):
    data_sha1 = hmac.new(key,data,hashlib.sha1).digest()
    data_sha1_base64 = base64.b64encode(data_sha1)
    return data_sha1_base64

如下代碼是對應的php寫法,當時用python實現是爲了測試開發人員的接口實現的正確性加密

base64_encode(hash_hmac("sha1", QUERY_STRING, KEY, TRUE))

 

 

ps:有個搞不明白的地方在此記錄,以上實際使用時,hmac模塊的sha1加密算法獲得的值,經過hashlib模塊無法獲得spa

研究hashlib底層代碼沒看懂如何加鹽即key,試着用以下方法,獲得的結果不對~

key = b'salt'
data = b'sjdhjwkdjk'
hm = hmac.new(key,data,hashlib.sha1) res1 = hm.digest() ha_s1 = hashlib.sha1(key) ha_s1.update(data) res2 = ha_s1.digest() res1和res2不相等
相關文章
相關標籤/搜索