關(guān)于存儲(chǔ)密碼的技術(shù)方案

過去一段時(shí)間以來, 許多的網(wǎng)站遭遇用戶密碼數(shù)據(jù)泄露事件, 這其中包括頂級的互聯(lián)網(wǎng)企業(yè)–Linkedin, 國內(nèi)諸如CSDN,該事件橫掃整個(gè)國內(nèi)互聯(lián)網(wǎng),隨后又爆出多玩游戲800萬用戶資料被泄露,另有傳言人人網(wǎng)视译、開心網(wǎng)怠硼、天涯社區(qū)、世紀(jì)佳緣吧秕、百合網(wǎng)等社區(qū)都有可能成為黑客下一個(gè)目標(biāo)。層出不窮的類似事件給用戶的網(wǎng)上生活造成巨大的影響迹炼,人人自危砸彬,因?yàn)槿藗兺?xí)慣在不同網(wǎng)站使用相同的密碼,所以一家“暴庫”斯入,全部遭殃拿霉。

那么我們作為一個(gè)Web應(yīng)用開發(fā)者,在選擇密碼存儲(chǔ)方案時(shí), 容易掉入哪些陷阱, 以及如何避免這些陷阱?

普通方案

目前用的最多的密碼存儲(chǔ)方案是將明文密碼做單向哈希后存儲(chǔ)咱扣,單向哈希算法有一個(gè)特征:無法通過哈希后的摘要(digest)恢復(fù)原始數(shù)據(jù)绽淘,這也是“單向”二字的來源。常用的單向哈希算法包括SHA-256, SHA-1, MD5等闹伪。

//import "crypto/sha256"

h := sha256.New()

io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")

fmt.Printf("% x", h.Sum(nil))

//import "crypto/sha1"

h := sha1.New()

io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")

fmt.Printf("% x", h.Sum(nil))

//import "crypto/md5"

h := md5.New()

io.WriteString(h, "需要加密的密碼")

fmt.Printf("%x", h.Sum(nil))

單向哈希有兩個(gè)特性:

1)同一個(gè)密碼進(jìn)行單向哈希沪铭,得到的總是唯一確定的摘要壮池。

2)計(jì)算速度快。隨著技術(shù)進(jìn)步杀怠,一秒鐘能夠完成數(shù)十億次單向哈希計(jì)算椰憋。

結(jié)合上面兩個(gè)特點(diǎn),考慮到多數(shù)人所使用的密碼為常見的組合赔退,攻擊者可以將所有密碼的常見組合進(jìn)行單向哈希橙依,得到一個(gè)摘要組合, 然后與數(shù)據(jù)庫中的摘要進(jìn)行比對即可獲得對應(yīng)的密碼。這個(gè)摘要組合也被稱為rainbow table硕旗。

因此通過單向加密之后存儲(chǔ)的數(shù)據(jù)窗骑,和明文存儲(chǔ)沒有多大區(qū)別。因此漆枚,一旦網(wǎng)站的數(shù)據(jù)庫泄露创译,所有用戶的密碼本身就大白于天下。

進(jìn)階方案

通過上面介紹我們知道黑客可以用rainbow table來破解哈希后的密碼墙基,很大程度上是因?yàn)榧用軙r(shí)使用的哈希算法是公開的软族。如果黑客不知道加密的哈希算法是什么,那他也就無從下手了残制。

一個(gè)直接的解決辦法是立砸,自己設(shè)計(jì)一個(gè)哈希算法。然而初茶,一個(gè)好的哈希算法是很難設(shè)計(jì)的——既要避免碰撞颗祝,又不能有明顯的規(guī)律,做到這兩點(diǎn)要比想象中的要困難很多纺蛆。因此實(shí)際應(yīng)用中更多的是利用已有的哈希算法進(jìn)行多次哈希吐葵。

但是單純的多次哈希规揪,依然阻擋不住黑客桥氏。兩次 MD5、三次 MD5之類的方法猛铅,我們能想到字支,黑客自然也能想到。特別是對于一些開源代碼奸忽,這樣哈希更是相當(dāng)于直接把算法告訴了黑客堕伪。

沒有攻不破的盾,但也沒有折不斷的矛±醪耍現(xiàn)在安全性比較好的網(wǎng)站欠雌,都會(huì)用一種叫做“加鹽”的方式來存儲(chǔ)密碼,也就是常說的 “salt”疙筹。他們通常的做法是富俄,先將用戶輸入的密碼進(jìn)行一次MD5(或其它哈希算法)加密禁炒;將得到的 MD5 值前后加上一些只有管理員自己知道的隨機(jī)串,再進(jìn)行一次MD5加密霍比。這個(gè)隨機(jī)串中可以包括某些固定的串幕袱,也可以包括用戶名(用來保證每個(gè)用戶加密使用的密鑰都不一樣)。

//import "crypto/md5"

//假設(shè)用戶名abc悠瞬,密碼123456

h := md5.New()

io.WriteString(h, "需要加密的密碼")

//pwmd5等于e10adc3949ba59abbe56e057f20f883e

pwmd5 :=fmt.Sprintf("%x", h.Sum(nil))

//指定兩個(gè) salt: salt1 = @#$%? salt2 = ^&*()

salt1 := "@#$%"

salt2 := "^&*()"

//salt1+用戶名+salt2+MD5拼接

io.WriteString(h, salt1)

io.WriteString(h, "abc")

io.WriteString(h, salt2)

io.WriteString(h, pwmd5)

last :=fmt.Sprintf("%x", h.Sum(nil))

在兩個(gè)salt沒有泄露的情況下们豌,黑客如果拿到的是最后這個(gè)加密串,就幾乎不可能推算出原始的密碼是什么了浅妆。

專家方案

上面的進(jìn)階方案在幾年前也許是足夠安全的方案望迎,因?yàn)楣粽邲]有足夠的資源建立這么多的rainbow table。 但是狂打,時(shí)至今日擂煞,因?yàn)椴⑿杏?jì)算能力的提升,這種攻擊已經(jīng)完全可行趴乡。

怎么解決這個(gè)問題呢对省?只要時(shí)間與資源允許,沒有破譯不了的密碼晾捏,所以方案是:故意增加密碼計(jì)算所需耗費(fèi)的資源和時(shí)間蒿涎,使得任何人都不可獲得足夠的資源建立所需的rainbow table。

這類方案有一個(gè)特點(diǎn)惦辛,算法中都有個(gè)因子劳秋,用于指明計(jì)算密碼摘要所需要的資源和時(shí)間,也就是計(jì)算強(qiáng)度胖齐。計(jì)算強(qiáng)度越大玻淑,攻擊者建立rainbow table越困難,以至于不可繼續(xù)呀伙。

這里推薦scrypt方案补履,scrypt是由著名的FreeBSD黑客Colin Percival為他的備份服務(wù)Tarsnap開發(fā)的。

dk := scrypt.Key([]byte("some password"), []byte(salt), 16384, 8, 1, 32)

通過上面的的方法可以獲取唯一的相應(yīng)的密碼值剿另,這是目前為止最難破解的箫锤。

總結(jié)

看到這里,如果你產(chǎn)生了危機(jī)感雨女,那么就行動(dòng)起來谚攒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氛堕,隨后出現(xiàn)的幾起案子馏臭,更是在濱河造成了極大的恐慌,老刑警劉巖讼稚,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括儒,死亡現(xiàn)場離奇詭異浪耘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塑崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門七冲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规婆,你說我怎么就攤上這事澜躺。” “怎么了抒蚜?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵掘鄙,是天一觀的道長。 經(jīng)常有香客問我嗡髓,道長操漠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任饿这,我火速辦了婚禮浊伙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘长捧。我一直安慰自己嚣鄙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布串结。 她就那樣靜靜地躺著哑子,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肌割。 梳的紋絲不亂的頭發(fā)上卧蜓,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音把敞,去河邊找鬼弥奸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛先巴,可吹牛的內(nèi)容都是我干的其爵。 我是一名探鬼主播冒冬,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼伸蚯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了简烤?” 一聲冷哼從身側(cè)響起剂邮,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎横侦,沒想到半個(gè)月后挥萌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰姻,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年引瀑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狂芋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憨栽,死狀恐怖帜矾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屑柔,我是刑警寧澤屡萤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掸宛,受9級特大地震影響死陆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唧瘾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一措译、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饰序,春花似錦瞳遍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至注祖,卻和暖如春猾蒂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背是晨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工肚菠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罩缴。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓蚊逢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箫章。 傳聞我的和親對象是個(gè)殘疾皇子烙荷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 所有貨幣都需要一些方法來控制供應(yīng),并強(qiáng)制執(zhí)行各種安全屬性以防止作弊檬寂。在法定貨幣方面终抽,像中央銀行這樣的組織控制貨幣供...
    Nutbox_Lab閱讀 3,076評論 1 3
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)昼伴、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹閱讀 2,335評論 0 6
  • 本文主要介紹移動(dòng)端的加解密算法的分類匾旭、其優(yōu)缺點(diǎn)特性及應(yīng)用,幫助讀者由淺入深地了解和選擇加解密算法圃郊。文中會(huì)包含算法的...
    蘋果粉閱讀 11,459評論 5 29
  • 我是個(gè)儀式感很強(qiáng)的人价涝。有時(shí)候,對儀式的注重近乎偏執(zhí)持舆,甚至把儀式流于形式飒泻。 昨天,被X先生教育一番之后吏廉,我也確乎是打...
    四小姐的家閱讀 519評論 0 50
  • 主要內(nèi)容 第一節(jié) - 創(chuàng)建最簡單的輸入框 第二節(jié) - 添加簡單的驗(yàn)證功能 第三節(jié) - 顯示驗(yàn)證失敗的錯(cuò)誤信息 第四...
    semlinker閱讀 1,225評論 0 4