以常見的加密演算法md5為例,計算乙個字串的md5值:
import hashlib
md5 = hashlib.md5(
)# update函式的加密文字:英文必須是ascii的二進位制格式
md5.update(b'how are you?i fine, and you?'
)print
(md5.hexdigest(
))
輸出結果:c61e87d5b1883b97428e02df773ba377
md5 = hashlib.md5(
)# update函式如果不是ascii格式,則必須對文字進行編碼,否則會報錯
md5.update(
"天王蓋地虎"
.encode(
'utf-8'))
print
(md5.hexdigest(
))
輸出結果:151df4d2ddbdd1ad6a64c2c18b294828
統一上述的寫法,將待加密的漢字或者英文content都可以直接先按照utf-8格式編碼。即:
import hashlib
md5 = hashlib.md5(
)content=
input
('請輸入待加密的文字內容:'
)md5.update(content.encode(
'utf-8'))
print
(md5.hexdigest(
))
如果資料量很大,可以分塊多次呼叫update()
,最後計算的結果是一樣的:
import hashlib
md5 = hashlib.md5(
)md5.update(b'how are you?'
)md5.update(b'i fine, and you?'
)print
(md5.hexdigest(
))
輸出的結果也是c61e87d5b1883b97428e02df773ba377
可以看到和上面的加密結果一模一樣。一般稍微改動乙個字母或者字元,該演算法計算出來的結果完全不同。md5是最常見的摘要演算法,速度很快,生成結果是固定的128 bit位元組,通常用乙個32位的16進製制字串表示。
除了md5摘要演算法外,比較常用的摘要演算法還有sha1,呼叫sha1和呼叫md5完全類似:
import hashlib
sha1 = hashlib.sha1(
)sha1.update(b'how are you?'
)sha1.update(b'i fine, and you?'
)print
(sha1.hexdigest(
))
輸出結果:3782065e98449054afc40c8dc23de53778703982
sha1的結果是160 bit位元組,通常用乙個40位的16進製制字串表示。
有沒有可能兩個不同的資料通過某個加密演算法得到了相同的密文?完全有可能,因為任何摘要演算法都是把無限多的資料集合對映到乙個有限的集合中。這種情況稱為碰撞。username
password
chimu
123456
trainingl
abc123
daimao
abcdef
如果以明文儲存使用者密碼,如果資料庫洩露,所有使用者的密碼就落入黑客的手裡。此外,**運維人員是可以訪問資料庫的,也就是能獲取到所有使用者的密碼。這樣對使用者資訊或者資料而言是極不安全的,我們往往希望的是,只有使用者自己知道自己的密碼。
import hashlib
md5 = hashlib.md5(
)password =
input
("待加密的明文密碼:"
正確的儲存密碼的方式是不儲存使用者的明文密碼,而是儲存使用者密碼的密文,比如md5:
username
password
chimu
e10adc3949ba59abbe56e057f20f883e
trainingl
e99a18c428cb38d5f260853678922e03
daimao
e80b5017098950fc58aad83c8c14978e
設計乙個驗證使用者登入的函式,根據使用者輸入的口令是否正確,返回true或false:
import hashlib
# 儲存使用者資訊的資料表:db.user
db =
deflogin
(username,password)
: md5 = hashlib.md5(
) md5.update(password.encode(
'utf-8'))
if username in db.keys():
if md5.hexdigest(
)== db[username]
:print
("歡迎登陸!"
)else
:print
('密碼錯誤,請重試!'
)else
:print
("使用者不存在,先註冊!"
)username =
input
("請輸入使用者名稱:"
)password =
input
("請輸入密碼:"
)login(username,password)
執行效果截圖:
由於常用口令的md5值很容易被計算出來,所以,要確保儲存的使用者口令不是那些已經被計算出來的常用口令的md5,這一方法通過對原始口令加乙個複雜字串來實現,俗稱「加鹽」:
經過salt處理的md5口令,只要salt不被黑客知道,即使使用者輸入簡單口令,也很難通過md5反推明文口令。
將上述的加密驗證需求改進之後如下:
import hashlib,random
defget_md5
(s):
return hashlib.md5(s.encode(
'utf-8'))
.hexdigest(
)class
user
(object):
def__init__
(self,username,password)
: self.username = username
self.salt =
''.join(
[chr
(random.randint(48,
122)
)for i in
range(20
)]) self.password = get_md5(password + self.salt)
db =
deflogin
(username,password)
: user = db[username]
pwd = get_md5(password + user.salt)
return user.password == pwd
print
(login(
'bob'
,"abc999"
))
摘要演算法在很多地方都有廣泛的應用。要注意摘要演算法不是加密演算法,不能用於加密(因為無法通過摘要反推明文),只能用於防篡改,但是它的單向計算特性決定了可以在不儲存明文口令的情況下驗證使用者口令。
參考廖雪峰老師的python教程
Python 加密模組
這裡介紹hashlib模組。2 加密 hashlib模組有很多種加密方法,如hashlib.sha224 hashlib.blake2b 等,這裡以md5加密為例。加密時,不能直接對字串進行加密,需要先將字串轉化為bytes型別,用str.encode 下面是乙個完整的加密過程。將上述功能寫成下列函...
python加密模組 hashlib模組
用於加密相關的操作,3.x裡代替了md5模組和sha模組,主要提供sha1,sha224,sha256,sha384,sha512,md5演算法 sha比md5 更複雜 md5 不能反解 具體使用方法 匯入模組 import hashlib 生成乙個加密的物件並複製給變數 m hashlib.md5...
python的加密模組
使用 pycrypto 模組 使用aes的乙個範例 usr bin env python coding utf 8 from crypto.cipher import aes import struct import hashlib import random def generagekey imp...