如何讓用戶可以正常登錄,同時不怕數據庫被盜?
每個網站都會設計自己的帳號系統,用戶不管是通過QQ還是微信登錄過來的,大多數網站都是想把他們轉入到自己的帳號系統,因為這樣估值的時候,這個用戶才是你的用戶,才好把故事講好。那這些用戶名和密碼該如何存儲才安全呢?或者說即使被「脫褲」了,如何才能不被黑產利用呢?
最近兩年曝光的事件,發現有幾個公司的密碼庫居然是明文存儲的,也就是“果果,123456”這樣的存儲方式,小學生都看得懂,直接可以登錄了,還談何安全。
具體是那幾個公司就不說了,以免有為他們做廣告,幫助他們東山再起的嫌疑(東山再起運用了夸張的修辭手法,你懂的,我是吹了個牛逼)。
所以,問題抽象為——如何讓用戶可以正常登錄,同時不怕數據庫被盜呢?先看看如下圖最原始的數據庫設計。
最原始的數據庫設計肯定是這樣的,想都不用想,被攻破,所有用戶密碼就泄漏了,小明和小紅所有的隱私也都泄漏了。
程序員不服輸,那我不讓Password字段是密碼不就可以了,于是變為了這樣,密碼是做了MD5(MD5傳送門:名詞解釋:時間戳、MD5、GUID)之后的密文,這樣用戶登錄的時候輸入123,后臺對比Md5(123)是不是202cb****這段數據,就能證明輸入正確與否了。
理論上MD5是單向的,也就是一個字符串會生成一個唯一的MD5碼(有開發同學就別較真了,我知道理論上不唯一會沖突,但概率非常小,產品經理請繼續認為基本唯一),這種情況下,數據庫泄漏了,有風險嗎?
答案是有風險,因為還有一幫程序員更聰明,發明了叫彩虹表的東西,彩虹表是把字符串和這些MD5值對應起來做了一個大數據庫,也就是知道了202cb****這段數字之后,會反向查找出字符串,也就拿到了明文的密碼。這個彩虹表一般都是上百個G的數據,所以用MD5或者SHA這些算法來保護密碼也有漏洞。
程序員又不服,繼續探索新的方法,客官注意了,我們馬上進入到高潮部分,講述如何用「加鹽」來解決這個問題。
如上圖所示,我們加了一個新的字段叫Salt,翻譯過來就是鹽,這個字段是用戶注冊的時候隨機產生的一個字符串,所以這回我們生成數據庫中的密碼就是這樣生成的:Md5(“123” + “jakldsfjn234jkl234jkl;123″)=6bbf7f8dd1f7dd3d7c03182620ba312f,當用戶輸入123的密碼時,后臺也用這個算法來驗證是不是可以正常登錄。
假設數據庫又被竊取了,這個時候拿到的密碼庫的Password字段是兩個字符串拼接的Md5值,這個時候由當前的密碼會得到“123” + “jakldsfjn234jkl234jkl;123”的字符串拼接的值,但是要區分出哪些部分是密碼成本是非常高的,而且這個salt可以夾雜在123這個字符串的任何位置,甚至可以將鹽分開比如1前面放三個字符,2后面兩個字符,剩下的接到3的結尾。
數學推理,果果也沒有求證和推演過,總之時間成本會令這種破解收益非常非常小,從而保護了密碼庫的安全。
#專欄作家#
給產品經理講技術,微信公眾號(pm_teacher),人人都是產品經理專欄作家。資深程序猿,專注客戶端開發若干年,對前端、后臺技術略懂,熱衷于對新的科技領域的探索。
本文原創發布于人人都是產品經理。未經許可,禁止轉載。
還可以sha1(md5)混合加密。
果果你跑到這里來啦
產品經理技術科普文
受小弟一拜