關於python中密碼加鹽的學習體會
阿新 • • 發佈:2019-02-08
給密碼加密是什麼:使用者註冊的密碼一般網站管理人員會利用md5方法加密,這種加密方法的好處是它是單向加密的,也就是說,你只有在提前知道某一串密碼對應的md5加密碼,才能反推出密碼是多少,雖然有極小的機率可能造成兩個密碼加密之後的值相等(這種現象稱為碰撞),不過基本上不用擔心,因為概率是極低的。在常用的hashlib模組裡還有sha1()等方法,它的本質和md5是一致的,只是產生的結果是160 bit位元組,通常用一個40位的16進位制字串表示。而md5是最常見的加密演算法,生成速度很快,生成結果是固定的128 bit位元組,通常用一個32位的16進位制字串表示。
給密碼加鹽是什麼:見上面提到的,下面內容摘自百度百科,是對彩虹表的大概定義和解釋
彩虹表是一個用於加密雜湊函式逆運算的預先計算好的表, 為破解密碼的雜湊值(或稱雜湊值、微縮圖、摘要、指紋、雜湊密文)而準備。一般主流的彩虹表都在100G以上。 這樣的表常常用於恢復由有限集字元組成的固定長度的純文字密碼。
md5和sha1加密介紹
import hashlib
md5=hashlib.md5()
md5.update('this is an example' .encode('utf-8'))
md5.update('again'.encode('utf-8')) #這裡要記得update()方法可以多次呼叫,可以自己試一試。
print(md5.hexdigest())
#承接上面
sha1=hashlib.sha1()
sha1.update('this is an example'.encode('utf-8'))
sha1.update('...'.encode('utf-8'))
print(sha1.hexdigest())
下面利用md5加密和加鹽的方法,實現簡單的使用者註冊,將資訊儲存在字典中,然後模擬登陸。
#!/usr/bin/python3
#-*-coding:UTF-8-*-
import hashlib,random
#註冊
storage={}
def registration(u,p):
if u in storage:
return 'username occupied.please choose another username...'
else:
storage[u]=Users(u,p)
#加密方法
def get_md5(s):
return hashlib.md5(s.encode('utf-8')).hexdigest()
#登陸
class Users(object):
def __init__(self,username,password):
self.username=username #!!!!!!!注意鹽是隨機給的,每註冊一個賬號給一次鹽,封裝在Users類裡面,在login函式裡比較相等時,
# a.salt是註冊時封裝好的鹽,這時是固定的鹽,所以只要賬號密碼對了就可以了。
self.salt=''.join([chr(random.randint(48,122)) for i in range(20)])
self.password=get_md5(password+self.salt)
def login(user,pw):
if user not in storage.keys():
return 'wrong username'
else:
a=storage[user]
if a.password==get_md5(pw+a.salt):
return 'succeeded'
else:
return 'wrong password'
registration('mary','12345')
registration('bob','aa895')
registration('kirk','ba155')
print(storage)
print(login('mary','12345'))
最重要是理解每一次的鹽都封裝好了,在login函式中,只要使用者輸入的密碼+封裝好的鹽正確,即可實現登陸