何為Hash?
Hash就是把任意長度的輸入通過散列算法變換成固定長度的輸出。
如何獲得Hash?
Hash是通過散列函數(shù)求出的。散列函數(shù)必須滿足以下兩個條件:
1.必須是一致的,同樣的輸入輸出要一致;
2.應將不同的輸入映射到不同的輸出;
應用小場景
眾所周知登陸網(wǎng)站一般都需要一個用戶名和登陸密碼,在用戶第一次注冊完成之后,每次登陸后臺都需要驗證用戶輸入的密碼。因此后臺需要記錄住用戶的相關信息:
| Name | Password |
|---|---|
| 小明 | 123456 |
| James | 654321 |
| Petter | 666666 |
但是如果這樣保存起來的話,一旦被竊取,用戶信息就暴露了。這時候就可以用到今天的主角Hash了。我們可以通過hash函數(shù)把密碼映射一下,只保存映射值就可以了。因為從密碼到映射值是唯一的,但是通過映射值推倒密碼是比較困難的。
import hashlib
def passwordmd5(password):
md5 = hashlib.md5()
md5.update(password.encode())
return md5.hexdigest()
print(passwordmd5("123456"))
print(passwordmd5("654321"))
print(passwordmd5("666666"))
簡單的利用hashlib庫里面的md5實現(xiàn)了一下,經過映射之后,記錄信息變成了以下:
| Name | Password |
|---|---|
| 小明 | e10adc3949ba59abbe56e057f20f883e |
| James | c33367701511b4f6020ec61ded352059 |
| Petter | f379eaf3c831b04de153469d1bec345e |
提高安全性
雖然以上方法已經把安全性提高了,但是如果用戶設置的密碼太簡單,有些人通過簡單測試,比如用一些常用的簡單密碼推倒hash值,然后再比獲得密碼。
111111 -> 96e79218965eb72c92a549dd5a330112
222222 -> e3ceb5881a0a1fdaad01296d7554868d
......
666666 -> f379eaf3c831b04de153469d1bec345e
為了再次提高安全性,可以對密碼進行‘加鹽’,即加入一些額外的字符來增加難度。這樣用戶即使設置了簡單密碼,加上額外字符后就不簡單了。
import hashlib
def passwordmd5(password):
newpass = password + '_salt'
md5 = hashlib.md5()
md5.update(newpass.encode())
return md5.hexdigest()