驗(yàn)證用戶密碼這件事

本篇經(jīng)與 @Gnnng, @pollow 討論、查資料化漆,在 MSTC 群中請教討論總結(jié)而成估脆。

hash_salt
hash_salt

我們都知道,數(shù)據(jù)庫里不能儲(chǔ)存用戶密碼的明文座云,那怎樣存儲(chǔ)才是最科學(xué)的呢疙赠?

為什么不能存明文?

仔細(xì)想想朦拖,即使使用明文放在數(shù)據(jù)庫里圃阳,用戶還是看不到別人的密碼,那為什么不能使用明文存儲(chǔ)呢璧帝?這是因?yàn)槟悴荒鼙WC自己數(shù)據(jù)庫的安全捍岳。之前 CSDN 因?yàn)橐粋€(gè)漏洞整站數(shù)據(jù)庫被拖下來,用戶的帳戶名和密碼就全部暴露在網(wǎng)站上了睬隶。這帶來一個(gè)更嚴(yán)重的問題锣夹,很多人在不同的站點(diǎn)上使用的都是同一個(gè)用戶名和密碼,別人拿著這個(gè)被暴露出來的密碼到其他各大網(wǎng)站苏潜,比如淘寶银萍,支付寶,網(wǎng)銀等等試一下恤左,用戶的損失就嚴(yán)重了贴唇。

加密 Hash

加密 Hash 是對數(shù)據(jù)的單向映射贰锁。單向映射就是指拿到 hash 后的值,無法得到原來的數(shù)據(jù)滤蝠。上面那個(gè)問題,如果我們把用戶的密碼 hash 一下再放到數(shù)據(jù)庫里授嘀,然后每次用戶登入的時(shí)候我們拿到用戶的真實(shí)密碼都先 hash 物咳,再與數(shù)據(jù)庫中的值進(jìn)行比對,這樣即使數(shù)據(jù)庫被人拖下來蹄皱,他也無法通過那個(gè) hash 后的值得到用戶的真實(shí)密碼了览闰。

Rainbow Table

可是真的是這樣嗎?一定程度上說是的巷折,別人得到 hash 之后压鉴,的確幾乎不可能逆向算出原始密碼。但換個(gè)思路想一想锻拘,用戶的密碼通常是簡單并且容易構(gòu)造的油吭,只要把這些常見的密碼 hash 一下得到這個(gè)對應(yīng)關(guān)系表,就很容易得到原始密碼了署拟。這樣的對應(yīng)關(guān)系表通常被稱為彩虹表[1](Rainbow Table)婉宰。

現(xiàn)在黑客們已經(jīng)構(gòu)造出 TB 級別的彩虹表[2],所以很多直接 hash 得來的密碼都會(huì)被直接查詢到推穷。

Salt

那用什么辦法可以防止彩虹表的直接查詢呢心包,有人提出了一個(gè)解決方案——加鹽(salt)。具體來說就是得到用戶的真實(shí)密碼后馒铃,再隨機(jī)生成一個(gè)字符串(即鹽)蟹腾,把密碼和鹽用某種方式組合起來(即加鹽)然后再 hash 后放后數(shù)據(jù)庫中,同時(shí)把鹽也放入數(shù)據(jù)庫中区宇。用戶登入的時(shí)候娃殖,從數(shù)據(jù)庫中取出對應(yīng)的鹽,再和得到的用戶密碼組合一下進(jìn)行 hash 萧锉,與數(shù)據(jù)庫中的 hash 值比對即可珊随。

那為什么這樣就能避免彩虹表碰撞呢?如果數(shù)據(jù)庫被人拖下來柿隙,他獲得了 hash 叶洞,同時(shí)也獲得了鹽,如果碰撞成功禀崖,他應(yīng)該很容易通過拿到的鹽得出用戶真實(shí)密碼榜帽佟?

是波附,也不是艺晴。

其實(shí)加鹽的真實(shí)目的昼钻,是對用戶的密碼進(jìn)行強(qiáng)化。用戶常常會(huì)使用弱的密碼封寞,比如幾位純數(shù)字之類然评,這太好構(gòu)造,很容易碰撞出來狈究。但是如果是幾十位碗淌,甚至幾百位的大小寫字母加數(shù)字還有特殊字符,這就很難構(gòu)造了抖锥,因?yàn)檫@樣的組合數(shù)目實(shí)在太多了亿眠。我們可以看到在 Rainbow Crack 這個(gè)網(wǎng)站上面,1 - 9 位數(shù)字和字母的組合就達(dá)到了 13,759,005,997,841,642 種之多磅废,數(shù)據(jù)量達(dá)到了 864 GB纳像,在這個(gè)基礎(chǔ)上每增加一位或者增加一種字符帶來的都是指數(shù)級別的數(shù)據(jù)量增長。因此拯勉,只要我們的鹽足夠強(qiáng)竟趾,很難用彩虹表碰撞成功。而換一種策略谜喊,即使他使用拿到的每個(gè)鹽去構(gòu)造新的一些彩虹表潭兽,代價(jià)也是巨大的。

多 hash 幾次斗遏?

有些人可能會(huì)想到山卦,拿到用戶的密碼后,多 hash 幾次會(huì)不會(huì)從一定程度上避免彩虹表碰撞呢诵次?答案是否定的账蓉。事實(shí)上,和大多數(shù)人想象得正好相反逾一,這樣做反而更加不安全铸本。

前面說,hash 函數(shù)是不可逆的遵堵,這是因?yàn)樵?hash 的過程中丟掉了原始數(shù)據(jù)的部分信息箱玷。也就是說,hash 是減熵的陌宿。當(dāng)進(jìn)行多重 hash 的時(shí)候锡足,整體的安全性其實(shí)取決于最弱的那個(gè) hash 函數(shù),因?yàn)槿绻麊我?hash 碰撞壳坪,多重 hash 一定碰撞舶得。

把上面那句話用表達(dá)式寫出來:

比如原先有函數(shù) hash1,并且

數(shù)據(jù)庫里面存儲(chǔ)了 y1 作為校驗(yàn)爽蝴,原始密碼是 x1沐批。如果有人碰撞出了 x2 纫骑,在我們的數(shù)據(jù)庫中就驗(yàn)證成功了。

而現(xiàn)在又有函數(shù) hash2九孩,并且

并且有

同時(shí)又有


如果用戶使用 x11 作為密碼先馆,那么使用 x12, x21, x22 都可以得到相同的 z1,所以更加不安全了躺彬。

換種思路竊取密碼

如果我們按照上面的策略存儲(chǔ)密碼了磨隘,可以暫時(shí)認(rèn)為數(shù)據(jù)庫方面是安全的了。如果要想竊取用戶的密碼顾患,就應(yīng)該從更薄弱的環(huán)節(jié)入手,比如網(wǎng)絡(luò)傳輸「鲞螅現(xiàn)在仍然有大量的網(wǎng)站沒有使用 HTTPS 傳輸數(shù)據(jù)江解,這意味著用戶發(fā)送的數(shù)據(jù)可能在經(jīng)過的每一個(gè)路由節(jié)點(diǎn)上被監(jiān)聽到。所以還沒等服務(wù)器拿到用戶的密碼原文徙歼,中間人已經(jīng)獲取到所有想要的信息了犁河。

這時(shí)候怎么辦呢?最好的解決辦法就是換成 HTTPS魄梯,從根本上避免這種監(jiān)聽桨螺。但如果做不到,我們可以退而求其次想一些折衷的辦法[3]酿秸。

策略一灭翔,前端直接 hash 密碼送到后端進(jìn)行加鹽 hash。不可行辣苏。因?yàn)槿绻腥藦膭e處已經(jīng)得到了一些 hash 后的值肝箱,那么他就不需要猜測用戶原來的密碼,直接把 hash 送到后端進(jìn)行驗(yàn)證就行了稀蟋,反而降低了難度煌张。

策略二,在前端加鹽 hash 退客,再傳到后端直接進(jìn)行比對骏融。不可行。這給黑客提供了一個(gè)方便——他不需要知道密碼就可以方便地在你這里驗(yàn)證某些用戶名或郵箱是否是有效的萌狂。

策略三档玻,既然不能從后端獲取 salt ,那簡便的方法就是使用前后端約定好的一個(gè)固定的 salt 進(jìn)行 hash粥脚,比如用戶的用戶名窃肠,或者郵箱。這樣就保證了中間人監(jiān)聽不到真實(shí)的密碼刷允,同時(shí)又因?yàn)樵诤蠖擞诌M(jìn)行了一次安全的加鹽 hash 冤留,保證了數(shù)據(jù)庫的安全性碧囊。

用什么 hash 函數(shù)?

  1. 經(jīng)過安全測試的加密 hash 函數(shù)纤怒,如: SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3 等等
  2. Key Stretching 算法糯而,如: PBKDF2, bcrypt, scrypt 等
  3. 安全版本的 Unix crypt,如: $2y$, $5$, $6$

總結(jié)

  • 前端使用固定 salt 加密后送給后端
  • 后端生成強(qiáng)大的 salt 將前端送來的值加密儲(chǔ)存
  • 使用安全的 hash 函數(shù)
  • 如果可能泊窘,使用 HTTPS

參考資料


  1. Rainbow Table ?

  2. Rainbow Crack ?

  3. Salted Password Hashing - Doing it Right ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熄驼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烘豹,更是在濱河造成了極大的恐慌瓜贾,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件携悯,死亡現(xiàn)場離奇詭異祭芦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)憔鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門龟劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轴或,你說我怎么就攤上這事昌跌。” “怎么了照雁?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵蚕愤,是天一觀的道長。 經(jīng)常有香客問我饺蚊,道長审胸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任卸勺,我火速辦了婚禮砂沛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曙求。我一直安慰自己碍庵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布悟狱。 她就那樣靜靜地躺著静浴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挤渐。 梳的紋絲不亂的頭發(fā)上苹享,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼得问。 笑死囤攀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宫纬。 我是一名探鬼主播焚挠,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漓骚!你這毒婦竟也來了蝌衔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝌蹂,失蹤者是張志新(化名)和其女友劉穎噩斟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孤个,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亩冬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼身。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆享,死狀恐怖佳遂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撒顿,我是刑警寧澤丑罪,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站凤壁,受9級特大地震影響吩屹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拧抖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一煤搜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唧席,春花似錦擦盾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徒仓,卻和暖如春腐碱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掉弛。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工症见, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂走,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓筒饰,卻偏偏與公主長得像缴啡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子瓷们,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 現(xiàn)在比較流行的密碼存儲(chǔ)是對密碼明文做 HASH運(yùn)算业栅,把得到HASH值存儲(chǔ)到數(shù)據(jù)庫中。驗(yàn)證過程就是再次對用戶發(fā)過來的...
    JSON_NULL閱讀 3,519評論 4 7
  • 【作者】張輝谬晕,就職于攜程技術(shù)中心信息安全部碘裕,負(fù)責(zé)安全產(chǎn)品的設(shè)計(jì)與研發(fā)。作為互聯(lián)網(wǎng)公司的信息安全從業(yè)人員經(jīng)常要處理撞...
    滕的世界閱讀 2,065評論 1 2
  • 前幾天攒钳,我的一位朋友的apple賬戶被盜了帮孔。看到朋友給我發(fā)的幾張圖不撑,頓時(shí)覺得盜取者的面目可憎文兢。看下面的截圖焕檬,可以說...
    jaymz明閱讀 460評論 2 9
  • 1姆坚、哈希運(yùn)算:即散列函數(shù)。它是一種單向密碼體制,即它是一個(gè)從明文到密文的不可逆的映射,只有加密過程,沒有解密過程实愚。...
    YeehamChan閱讀 2,317評論 1 2
  • 伊尹是中國歷史上唯一一個(gè)由廚入相的人兼呵,是中國歷史上杰出的賢相、帝師腊敲。他輔佐商湯打敗了殘暴的夏桀击喂,建立了商朝。 伊尹...
    deity0808閱讀 618評論 0 0