1,為什么數(shù)據(jù)庫(kù)中保存的是密碼的MD5值,而不是明文?
首先我們確認(rèn)的一點(diǎn)是:MD5肯定比明文要安全一些(當(dāng)然肯定不是最安全的)
如果數(shù)據(jù)庫(kù)存儲(chǔ)的是明文,如果數(shù)據(jù)庫(kù)被黑了,那么明文密碼泄露之后,普通用戶都可以很容易登錄.
但是如果存儲(chǔ)的是MD5值,就算泄露了,普通用戶也沒法登錄.因?yàn)轫?yè)面上登錄時(shí)要求輸入明文.
當(dāng)然程序員可以直接調(diào)用登錄接口,傳遞密碼MD5值也可以登錄.
另外一點(diǎn):明文包含更多的信息(相對(duì)于其MD5值),比如明文可能是銀行密碼,或者包含出生日期等,這些都是敏感信息.
使用MD5之后,這些敏感信息就會(huì)被抹掉.即信息量減少
如果使用明文存儲(chǔ),那么登錄時(shí),網(wǎng)絡(luò)傳輸?shù)氖敲艽a明文.
2,遇到的問題
若數(shù)據(jù)庫(kù)存儲(chǔ)的是密碼MD5值,那么密碼強(qiáng)度就不方便計(jì)算.
因?yàn)槊艽a強(qiáng)度是根據(jù)密碼明文來計(jì)算的,而不是密碼的MD5值,但是數(shù)據(jù)庫(kù)中存儲(chǔ)的是密碼的MD5值.
根據(jù)MD5值是沒法計(jì)算密碼強(qiáng)度的,因?yàn)镸D5值不可逆,即根據(jù)MD5值沒法得到明文.
所以此時(shí)密碼強(qiáng)度應(yīng)該在前端校驗(yàn)
3,原則:
(1)在網(wǎng)絡(luò)傳輸中,不能傳輸密碼明文;
(2)密碼明文不能落地,即密碼明文不能存儲(chǔ)在任何地方,包括數(shù)據(jù)庫(kù),瀏覽器cookie
(3)就算數(shù)據(jù)庫(kù)被黑,黑客也沒法計(jì)算出明文
其實(shí)我想到了一種方案:
數(shù)據(jù)庫(kù)中存儲(chǔ)的仍然不是密碼明文,但是也不是MD5值,而是加密(對(duì)稱加密,比如AES,DES等)的密文.
因?yàn)闈M足了:
(1)數(shù)據(jù)庫(kù)沒有存儲(chǔ)密碼明文;
(2)可以很方便地計(jì)算密碼強(qiáng)度
(3)忘記密碼很容易恢復(fù)
(4)網(wǎng)絡(luò)傳輸?shù)娜匀皇敲艽a的MD5值(后臺(tái)先解密得到密碼明文,然后計(jì)算明文的MD5值)
優(yōu)點(diǎn):后臺(tái)可以計(jì)算出密碼明文;
缺點(diǎn):黑客仍然有可能獲取明文
只要
(a)黑掉數(shù)據(jù)庫(kù);
(b)獲取到秘鑰
但是使用MD5存儲(chǔ),黑客永遠(yuǎn)都無法獲取密碼明文
4,如果使用DES加密,秘鑰保存在什么地方呢?
DES加密是對(duì)稱加密,密鑰的保持就是個(gè)大問題,保持在應(yīng)用程序中的密鑰非常容易被破解。而且des密鑰一旦泄漏,就等于統(tǒng)統(tǒng)泄漏了。所以在軟件中用des比較傻逼。md5 在密文夠復(fù)雜的情況下,用字典法破解很難,如果再限制驗(yàn)證數(shù),基本不可能被破解,當(dāng)然,如果密碼很簡(jiǎn)單如111 222 神馬的,就當(dāng)我沒說
如果用加密機(jī)的話,密鑰一次性上載,退一步用軟件,密鑰也會(huì)作嚴(yán)密保護(hù)。密鑰還分級(jí)別,定時(shí)更換。暴力破解MD5是比較容易的,但窮舉DES密鑰幾乎是不可能的任務(wù),2^56的可能。兩者破解方式不同,MD5是嘗試明文,DES是嘗試密鑰。編兩個(gè)程序就能看出兩者之間巨大的計(jì)算量差異。DES還可以使用Triple的方式,密鑰擴(kuò)展為128位?,F(xiàn)在DES已經(jīng)慢慢推出應(yīng)用領(lǐng)域了,AES是更好的選擇。
分散算法可以是任何算法,RSA,DES,MD5,甚至異或都可以。目前實(shí)際多用3DES,主要是因?yàn)橛布?shí)現(xiàn)比較成熟,在大交易量的時(shí)候能夠保證性能。比如銀行隨機(jī)產(chǎn)生一個(gè)大隨機(jī)數(shù),導(dǎo)入加密機(jī),作為根密鑰。然后配合銀行U盾的芯片編號(hào)或者POS機(jī)編號(hào)進(jìn)行一次分散運(yùn)算,產(chǎn)生一個(gè)密鑰,作為這個(gè)U盾或者POS的根密鑰。這種密鑰一般是灌在機(jī)器的SIM卡的只寫區(qū)的,是沒有可能讀出來的。然后再具體交易的時(shí)候,用這個(gè)密鑰配合交易時(shí)間,交易流水號(hào)等信息,再次進(jìn)行分散,產(chǎn)生工作密鑰,一般用工作密鑰來加密客戶密碼,金額,借貸方賬號(hào)等敏感信息。當(dāng)報(bào)文發(fā)送到服務(wù)器端后,服務(wù)器根據(jù)設(shè)備編號(hào),交易流水號(hào),重新分散出工作密鑰,然后解密報(bào)文信息。這樣的交互方式下,客戶端和服務(wù)器端是沒有DES密鑰交互的。銀行如果發(fā)現(xiàn)任何一個(gè)終端設(shè)備異常,只要將這個(gè)設(shè)備的根密鑰廢掉,對(duì)于整個(gè)系統(tǒng)沒有任何影響。而且不論加密機(jī)還是SIM卡中的密鑰,都是硬件保證不可讀的。所以目前最安全的網(wǎng)絡(luò)支付手段就是USBKEY做電子簽名,千萬別用什么快捷支付,只要開了這個(gè)口子,遲早被釣魚。
5,建議
在使用MD5保存密碼時(shí),最好加入混淆的字符串:
用戶名
即數(shù)據(jù)庫(kù)存儲(chǔ)的MD5值是(密碼明文的MD5+用戶名)的MD5值,
為什么不是(密碼明文+用戶名)的MD5值?因?yàn)榫W(wǎng)絡(luò)傳輸不能傳輸密碼明文(這是原則)
參考:http://lt.cjdby.net/thread-1302097-2-1.html
參考:http://hw1287789687.iteye.com/blog/2248374
SegmentFault 登錄密碼竟然是明文
