Python3.7之hashlib加密


一、哈希

1. 什么是可哈希(hashable)

簡要的說,可哈希的數據類型,即不可變的數據結構(字符串str、元組tuple、對象集objects)。

2. 哈希有什么作用

它是一個將大體量數據轉化為很小數據的過程,甚至可以僅僅是一個數字,以便我們可以用在固定的時間復雜度下查詢它,所以,哈希對高效的算法和數據結構很重要。

3. 什么是不可哈希(unhashable)

同理,不可哈希的數據類型,即可變的數據結構 (字典dict,列表list,集合set)。

4. hash(object)

hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。返回對象的哈希值。

二、HASH(散列函數)

1. 簡介

哈希(hash)也翻譯作散列。Hash算法,是將一個不定長的輸入,通過散列函數變換成一個定長的輸出,即散列值。
這種散列變換是一種單向運算,具有不可逆性即不能根據散列值還原出輸入信息,因此嚴格意義上講Hash算法是一種消息摘要算法,不是一種加密算法。常見的hash算法有:SM3、MD5、SHA-1等 。

2. 應用

Hash主要應用在數據結構以及密碼學領域。
在不同的應用場景下,hash函數的選擇也會有所側重。比如在管理數據結構時,主要要考慮運算的快速性,並且要保證hash均勻分布;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不同明文hash值相同的情況發生。

2.1 在密碼學領域的應用

在密碼學中,Hash算法的作用主要是用於消息摘要和簽名,換句話說,它主要用於對整個消息的完整性進行校驗。比如一些登陸網站並不會直接明文存儲用戶密碼,存儲的是經過hash處理的密碼的摘要(hash值),當用戶登錄時只需要對比輸入明文的摘要與數據庫存儲的摘要是否相同;即使黑客入侵或者維護人員訪問數據庫也無法獲取用戶的密碼明文,大大提高了安全性。

2.2 在數據結構中的應用

使用Hash算法的數據結構叫做哈希表,也叫散列表,主要是為了提高查詢的效率。它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數就是hash函數,存放記錄的數組叫做哈希表。在數據結構中應用時,有時需要較高的運算速度而弱化考慮抗碰撞性,可以使用自己構建的哈希函數。

3. hash()

①相同的數值,不同的類型,哈希值相同

>>> n = hash(1)
>>> n
1
>>> n = hash(1.0)
>>> n
1

②相同字符串在同一次運行時的哈希值是相同的,但是不同次運行的哈希值不同

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> m = hash('Vivian')
>>> m
-2338955002766744599  # 第一次哈希值
>>> exit()

C:\Users\Administrator>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> m = hash('Vivian')
>>> m
2113605006884176523  # 第二次哈希值

這是由於Python的字符串hash算法有一個啟動時隨機生成secret prefix/suffix的機制,存在隨機化現象:對同一個字符串輸入,不同解釋器進程得到的hash結果可能不同。因此當需要做可重現可跨進程保持一致性的hash,需要用到hashlib模塊。

三、hashlib模塊

hashlib提供了常見的摘要算法,如MD5,SHA1等等

注:coding:utf-8

import hashlib
# md5
m = hashlib.md5()
m.update(b'Vivian')
print(m.digest())  # 返回二進制的哈希值 b'\xe5if5\x05\x02\x1a!wR\xd6\xfa(\xae\r\xcb'
print(m.hexdigest())  # 返回十六進制的哈希值 e569663505021a217752d6fa28ae0dcb

m.update('你好'.encode('utf-8'))
print(m.hexdigest())  # 6ea8d7a29ea0706bdaca285e1d2ddd17
# m兩次加密后的值 等於 兩次字串拼接后一次加密的值
n = hashlib.md5()
n.update('Vivian你好'.encode('utf-8'))
print(n.hexdigest())  # 6ea8d7a29ea0706bdaca285e1d2ddd17

# sha1
m = hashlib.sha1()
m.update(b'Vivian')
print(m.hexdigest())  # 587bf2d7314da0ae33623bed16d872620b2768be
# sha256
m = hashlib.sha256()
m.update(b'Vivian')
print(m.hexdigest())  # 2f7caf725fb93a456e84100bdf98b91405e62f6e7ca99bc4e0b4a1993bf9e5c0
# sha512
m = hashlib.sha512()
m.update(b'Vivian')
print(m.hexdigest())
# d75e73edd6ab1801e3dbfcd5c504dca16f3c252f750411da7fdddc9b60013ad97844b6f86de29d3f9a6d07d2c93a53d6c9de9b548b8697f3c2494857176011dc


免責聲明!

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



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