day22- hashlib模塊-摘要算法(哈希算法)

# python的hashlib提供了常見的摘要算法,如md5(md5算法),sha1等等。摘要:digest
# 摘要算法又稱哈希算法、散列算法。
# 它經過一個函數,把任意長度的數據(明文)轉換爲一個長度固定的數據串(密文)(一般用16進制的字符串表示)。
# 摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,
# 目的是爲了發現原始數據是否被人篡改過。摘要算法之因此能指出數據是否被篡改過,
# 就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。
# 並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。
# 要注意摘要算法雖然能夠用於加密,但網上有不少能夠解密的網站,存在必定的被破解的風險。
# 一個明文對應惟一密文。經常使用於對比登陸密碼和存儲在電腦的密碼或網站密碼(文件的一致性校驗)。
# 若是以明文保存用戶口令(用戶名或密碼),若是數據庫泄露,全部用戶的口令就落入黑客的手裏。黑客撞庫。
# 此外,網站運維人員是能夠訪問數據庫的,也就是能獲取到全部用戶的口令。
# 正確的保存口令的方式是不存儲用戶的明文口令,而是存儲用戶口令的摘要,好比md5


# 1.
import hashlib
md5 = hashlib.md5()#md5可改成sha1,比sha1更安全的算法是sha256和sha512,不過越安全的算法越慢,並且摘要長度更長。
md5.update(b'136320') #b'136320'至關於'136320'.encode('utf-8')。
print(md5.hexdigest())#d5d082d2642302fae506350fff337632,這是md5值,一個32位的16進制字符串。

# 2.若是數據量很大,能夠分塊屢次調用update(),最後計算的結果是同樣的:
import hashlib
md5 = hashlib.md5()
md5.update(b'13')
md5.update(b'6320')#13跟6320疊加的md5值跟136320的md5值是同樣的。
print(md5.hexdigest())#d5d082d2642302fae506350fff337632
# md5.update(b'136320')
# print(md5.hexdigest())#d5d082d2642302fae506350fff337632

# 3. 用戶註冊,密碼是md5值:
import hashlib
username = input('username:')
password = input('password:')
md5 = hashlib.md5() #獲取md5對象
md5.update(bytes(password,encoding = 'utf-8')) #加密:md5.update密碼
md5_pwd = md5.hexdigest() #獲取md5值(密文)
with open('username&password',mode = 'w',encoding = 'utf-8') as f:
    f.write('%s&%s'%(username,md5_pwd))


# 4. 用戶登陸驗證:
import hashlib
username = input('username:')
password = input('password:')
with open('username&password',encoding = 'utf-8') as f:
    for line in f:
        user,pwd = line.split('&')
    md5 = hashlib.md5()
    md5.update(bytes(password,encoding='utf-8'))
    #要寫上encoding='utf-8',否則會拋出string argument without an encoding
    md5_pwd = md5.hexdigest()
    if username == user and md5_pwd == pwd:
        print('登陸成功')
    else:
        print('帳戶或密碼不對')

# 5. 加鹽:通過Salt處理的MD5口令,只要Salt不被黑客知道,即便用戶輸入簡單口令,也很難經過MD5反推明文口令,但也存在必定的被破解的風險。
import hashlib
md5 = hashlib.md5(bytes('salt',encoding = 'utf-8'))#salt能夠是任意字符。
md5.update(b'136320')
print(md5.hexdigest())#dc740385c07799eefb7c1f1ae24050ee
# 加了鹽以後,md5值跟原來的d5d082d2642302fae506350fff337632不同。

#鹽後面還能夠加其餘字符:b'123'
import hashlib
md5 = hashlib.md5(bytes('salt',encoding = 'utf-8') + b'123')
md5.update(b'136320')
print(md5.hexdigest())
相關文章
相關標籤/搜索