鹽(Salt)
在密碼學(xué)中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符,這種過程稱之為“加鹽”。(看不懂沒關(guān)系,接著往下看)
第一代密碼
早期的軟件系統(tǒng)或者互聯(lián)網(wǎng)應(yīng)用,數(shù)據(jù)庫中設(shè)計用戶表的時候,大致是這樣的結(jié)構(gòu):
mysql> desc User;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| UserName | varchar(50) | NO | | | |
| PassWord | varchar(150) | NO | | | |
+----------+--------------+------+-----+---------+-------+
數(shù)據(jù)存儲形式如下:
mysql> select * from User;
+----------+----------+
| UserName | PassWord |
+----------+----------+
| lichao | 123 |
| akasuna | 456 |
+----------+----------+
主要的關(guān)鍵字段就是這么兩個,一個是登陸時的用戶名,對應(yīng)的一個密碼,而且那個時候的用戶名是明文存儲的,如果你登陸時用戶名是 123,那么數(shù)據(jù)庫里存的就是 123。這種設(shè)計思路非常簡單,但是缺陷也非常明顯,數(shù)據(jù)庫一旦泄露,那么所有用戶名和密碼都會泄露,后果非常嚴重。參見《CSDN 詳解 600 萬用戶密碼泄露始末》。?
第二代密碼
為了規(guī)避第一代密碼設(shè)計的缺陷,聰明的人在數(shù)據(jù)庫中不在存儲明文密碼,轉(zhuǎn)而存儲加密后的密碼,典型的加密算法是 MD5 和 SHA1,其數(shù)據(jù)表大致是這樣設(shè)計的:
mysql> desc User;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| UserName | varchar(50) | NO | | | |
| PwdHash | char(32) | NO | | | |
+----------+--------------+------+-----+---------+-------+
數(shù)據(jù)存儲形式如下:
mysql> select * from User;
+----------+----------------------------------+
| UserName | PwdHash |
+----------+----------------------------------+
| lichao | 202cb962ac59075b964b07152d234b70 |
| akasuna | 250cf8b51c773f3f8dc8b4be867a9a02 |
+----------+----------------------------------+
假如你設(shè)置的密碼是 123,那么數(shù)據(jù)庫中存儲的就是 202cb962ac59075b964b07152d234b70 或 40bd001563085fc35165329ea1ff5c5ecbdbbeef。當(dāng)用戶登陸的時候,會把用戶輸入的密碼執(zhí)行 MD5(或者 SHA1)后再和數(shù)據(jù)庫就行對比,判斷用戶身份是否合法,這種加密算法稱為散列。
嚴格地說,這種算法不能算是加密,因為理論上來說,它不能被解密。所以即使數(shù)據(jù)庫丟失了,但是由于數(shù)據(jù)庫里的密碼都是密文,根本無法判斷用戶的原始密碼,所以后果也不算太嚴重。
第三代密碼
本來第二代密碼設(shè)計方法已經(jīng)很不錯了,只要你密碼設(shè)置得稍微復(fù)雜一點,就幾乎沒有被破解的可能性。但是如果你的密碼設(shè)置得不夠復(fù)雜,被破解出來的可能性還是比較大的。
好事者收集常用的密碼,然后對他們執(zhí)行 MD5 或者 SHA1,然后做成一個數(shù)據(jù)量非常龐大的數(shù)據(jù)字典,然后對泄露的數(shù)據(jù)庫中的密碼就行對比,如果你的原始密碼很不幸的被包含在這個數(shù)據(jù)字典中,那么花不了多長時間就能把你的原始密碼匹配出來。這個數(shù)據(jù)字典很容易收集,CSDN 泄露的那 600w 個密碼,就是很好的原始素材。
于是,第三代密碼設(shè)計方法誕生,用戶表中多了一個字段:
mysql> desc User;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| UserName | varchar(50) | NO | | | |
| Salt | char(50) | NO | | | |
| PwdHash | char(32) | NO | | | |
+----------+-------------+------+-----+---------+-------+
數(shù)據(jù)存儲形式如下:
mysql> select * from User;
+----------+----------------------------+----------------------------------+
| UserName | Salt | PwdHash |
+----------+----------------------------+----------------------------------+
| lichao | 1ck12b13k1jmjxrg1h0129h2lj | 6c22ef52be70e11b6f3bcf0f672c96ce |
| akasuna | 1h029kh2lj11jmjxrg13k1c12b | 7128f587d88d6686974d6ef57c193628 |
+----------+----------------------------+----------------------------------+
Salt 可以是任意字母、數(shù)字、或是字母或數(shù)字的組合,但必須是隨機產(chǎn)生的,每個用戶的 Salt 都不一樣,用戶注冊的時候,數(shù)據(jù)庫中存入的不是明文密碼,也不是簡單的對明文密碼進行散列,而是 MD5( 明文密碼 + Salt),也就是說:
MD5('123' + '1ck12b13k1jmjxrg1h0129h2lj') = '6c22ef52be70e11b6f3bcf0f672c96ce'
MD5('456' + '1h029kh2lj11jmjxrg13k1c12b') = '7128f587d88d6686974d6ef57c193628'
?文章來源地址http://www.zghlxwxcb.cn/news/detail-465663.html
“鹽值”是一組隨機的字符串,被稱為Salt,由系統(tǒng)隨機生成。Salt可以插在最前面、最后面,也可以插在中間,可分開插入也可倒序。
?
用戶注冊時:
- 用戶在網(wǎng)站注冊時提供ID與密碼;
- 系統(tǒng)為用戶分配鹽值;
- 鹽值插入密碼后進行HASH;
- 將ID,HASH值與鹽值一起存入數(shù)據(jù)庫。
身份驗證時:文章來源:http://www.zghlxwxcb.cn/news/detail-465663.html
- 用戶提供ID與密碼;
- 系統(tǒng)在數(shù)據(jù)庫中通過用戶提供的ID查找HASH值與鹽值;
- 將鹽值插入用戶提供的密碼后進行HASH;
- 將HASH值與數(shù)據(jù)庫中的HASH值比較,相等則驗證成功,反之則驗證失敗。
?
到了這里,關(guān)于數(shù)據(jù)存儲中的加鹽到底是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!