最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

為什么 MD5 不能用于存儲(chǔ)密碼

2023-03-14 00:28 作者:文昌閣里學(xué)前端  | 我要投稿

很多軟件工程師都認(rèn)為 MD5 是一種加密算法,然而這種觀點(diǎn)其實(shí)是大錯(cuò)特錯(cuò)并且十分危險(xiǎn)的,作為一個(gè) 1992 年第一次被公開(kāi)的算法,到今天為止已經(jīng)被發(fā)現(xiàn)了一些致命的漏洞,我們?cè)谏a(chǎn)環(huán)境的任何場(chǎng)景都不應(yīng)該繼續(xù)使用 MD5 算法,無(wú)論是對(duì)數(shù)據(jù)或者文件的內(nèi)容進(jìn)行校驗(yàn)還是用于所謂的『加密』。

這篇文章的主要目的是幫助讀者理解 MD5 到底是什么,為什么我們不應(yīng)該繼續(xù)使用它,尤其是不應(yīng)該使用它在數(shù)據(jù)庫(kù)中存儲(chǔ)密碼,作者也希望使用過(guò) MD5 或者明文存儲(chǔ)密碼的開(kāi)發(fā)者們能夠找到更加合理和安全的方式對(duì)用戶的這些機(jī)密信息進(jìn)行存儲(chǔ)(這樣也可以間接提高我在各類網(wǎng)站中存儲(chǔ)密碼的安全性)。

概述

與『為什么我們不能使用 MD5 來(lái)存儲(chǔ)密碼?』這一問(wèn)題相似的其實(shí)還有『為什么我們不能使用明文來(lái)存儲(chǔ)密碼?』,使用明文來(lái)存儲(chǔ)密碼是一種看起來(lái)就不可行的方案,除非我們能夠 100% 保證數(shù)據(jù)庫(kù)中的密碼字段不會(huì)被任何人訪問(wèn)到,不僅包括潛在的攻擊者,還包括系統(tǒng)的開(kāi)發(fā)者和管理員。

不過(guò)這是一個(gè)非常理想的情況,在實(shí)際的生產(chǎn)環(huán)境中,我們不能抵御來(lái)自黑客的所有攻擊,甚至也不能完全阻擋開(kāi)發(fā)者和管理員的訪問(wèn),因?yàn)槲覀兛傂枰湃尾⑹跈?quán)一些人或者程序具有當(dāng)前數(shù)據(jù)庫(kù)的所有訪問(wèn)權(quán)限,這也就給攻擊者留下了可以利用的漏洞,在抵御外部攻擊時(shí)我們沒(méi)有辦法做到全面,只能盡可能提高攻擊者的成本,這也就是使用 MD5 或者其他方式存儲(chǔ)密碼的原因了。



很多開(kāi)發(fā)者對(duì)于 MD5 的作用和定義都有著非常大的誤解,MD5 并不是一種加密算法,而是一種摘要算法,我們也可以叫它哈希函數(shù),哈希函數(shù)可以將無(wú)限鍵值空間中的所有鍵都均勻地映射到一個(gè)指定大小的鍵值空間中;一個(gè)好的摘要算法能夠幫助我們保證文件的完整性,避免攻擊者的惡意篡改,但是加密算法或者加密的功能是 —— 通過(guò)某種特定的方式來(lái)編碼消息或者信息,只有授權(quán)方可以訪問(wèn)原始數(shù)據(jù),而沒(méi)有被授權(quán)的人無(wú)法從密文中獲取原文。

由于加密需要同時(shí)保證消息的秘密性和完整性,所以加密的過(guò)程使用一系列的算法,MD5 確實(shí)可以在加密的過(guò)程中作為哈希函數(shù)使用來(lái)保證消息的完整性,但是我們還需要另一個(gè)算法來(lái)保證消息的秘密性,所以由于 MD5 哈希的信息無(wú)法被還原,只依靠 MD5 是無(wú)法完成加密的。

在任何場(chǎng)景下,我們都應(yīng)該避免 MD5 的使用,可以選擇更好的摘要算法替代 MD5,例如 SHA256、SHA512。

聊了這么多對(duì)于 MD5 的誤解,我們重新回到今天最開(kāi)始的題目,『為什么 MD5 不能用于存儲(chǔ)密碼』,對(duì)于這個(gè)問(wèn)題有一個(gè)最簡(jiǎn)單的答案,也就是?MD5 不夠安全。當(dāng)整個(gè)系統(tǒng)中的數(shù)據(jù)庫(kù)被攻擊者入侵之后,存儲(chǔ)密碼的摘要而不是明文是我們能夠?qū)λ杏脩舻淖畲蟊Wo(hù)。需要知道的是,不夠安全的不只是 MD5,任何摘要算法在存儲(chǔ)密碼這一場(chǎng)景下都不夠安全,我們?cè)谶@篇文章中就會(huì)哈希函數(shù)『為什么哈希函數(shù)不能用于存儲(chǔ)密碼』以及其他相關(guān)機(jī)制的安全性。

設(shè)計(jì)

既然我們已經(jīng)對(duì)哈希函數(shù)和加密算法有了一些簡(jiǎn)單的了解,接下來(lái)的這一節(jié)中分析使用以下幾種不同方式存儲(chǔ)密碼的安全性:

  • 使用哈希存儲(chǔ)密碼;

  • 使用哈希加鹽存儲(chǔ)密碼;

  • 使用加密算法存儲(chǔ)密碼;

  • 使用 bcrypt 存儲(chǔ)密碼;

在分析的過(guò)程中可能會(huì)涉及到一些簡(jiǎn)單的密碼學(xué)知識(shí),也會(huì)談到一些密碼學(xué)歷史上的一些事件,不過(guò)這對(duì)于理解不同方式的安全性不會(huì)造成太大的障礙。

哈希

在今天,如果我們直接使用哈希來(lái)存儲(chǔ)密碼,那其實(shí)跟存儲(chǔ)明文沒(méi)有太多的區(qū)別,所有的攻擊者在今天都已經(jīng)掌握了彩虹表這個(gè)工具,我們可以將彩虹表理解成一張預(yù)計(jì)算的大表,其中存儲(chǔ)著一些常見(jiàn)密碼的哈希,當(dāng)攻擊者通過(guò)入侵拿到某些網(wǎng)站的數(shù)據(jù)庫(kù)之后就可以通過(guò)預(yù)計(jì)算表中存儲(chǔ)的映射來(lái)查找原始密碼。



攻擊者只需要將一些常見(jiàn)密碼提前計(jì)算一些哈希就可以找到數(shù)據(jù)庫(kù)中很多用于存儲(chǔ)的密碼,Wikipedia 上有一份關(guān)于最常見(jiàn)密碼的?列表,在 2016 年的統(tǒng)計(jì)中發(fā)現(xiàn)使用情況最多的前 25 個(gè)密碼占了調(diào)查總數(shù)的 10%,雖然這不能排除統(tǒng)計(jì)本身的不準(zhǔn)確因素,但是也足以說(shuō)明僅僅使用哈希的方式存儲(chǔ)密碼是不夠安全的。

哈希加鹽

僅僅使用哈希來(lái)存儲(chǔ)密碼無(wú)法抵御來(lái)自彩虹表的攻擊,在上世紀(jì) 70 到 80 年代,早期版本的 Unix 系統(tǒng)就在?/etc/passwrd?中存儲(chǔ)加鹽的哈希密碼,密碼加鹽后的哈希與鹽會(huì)被一起存儲(chǔ)在?/etc/passwd?文件中,今天哈希加鹽的策略與幾十年前的也沒(méi)有太多的不同,差異可能在于鹽的生成和選擇:

md5(salt, password), salt

加鹽的方式主要還是為了增加攻擊者的計(jì)算成本,當(dāng)攻擊者順利拿到數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),由于每個(gè)密碼都使用了隨機(jī)的鹽進(jìn)行哈希,所以預(yù)先計(jì)算的彩虹表就沒(méi)有辦法立刻破譯出哈希之前的原始數(shù)據(jù),攻擊者對(duì)每一個(gè)哈希都需要單獨(dú)進(jìn)行計(jì)算,這樣能夠增加了攻擊者的成本,減少原始密碼被大范圍破譯的可能性。



在這種情況下,攻擊者破解一個(gè)用戶密碼的成本其實(shí)就等于發(fā)現(xiàn)哈希碰撞的概率,因?yàn)楣粽咂鋵?shí)不需要知道用戶的密碼是什么,他只需要找到一個(gè)值?value,這個(gè)值加鹽后的哈希與密碼加鹽后的哈希完全一致就能登錄用戶的賬號(hào):

hash(salt, value) = hash(salt, password)

這種情況在密碼學(xué)中叫做哈希碰撞,也就是兩個(gè)不同值對(duì)應(yīng)哈希相同,一個(gè)哈希函數(shù)或者摘要算法被找到哈希碰撞的概率決定了該算法的安全性,早在幾十年前,我們就在 MD5 的設(shè)計(jì)中發(fā)現(xiàn)了缺陷并且在隨后的發(fā)展中找到了低成本快速制造哈希碰撞的方法。

  1. 1996 年?The Status of MD5 After a Recent Attack?—— 發(fā)現(xiàn)了 MD5 設(shè)計(jì)中的缺陷,但是并沒(méi)有被認(rèn)為是致命的缺點(diǎn),密碼學(xué)專家開(kāi)始推薦使用其他的摘要算法;

  2. 2004 年?How to Break MD5 and Other Hash Functions?—— 發(fā)現(xiàn)了 MD5 摘要算法不能抵抗哈希碰撞,我們不能在數(shù)字安全領(lǐng)域使用 MD5 算法;

  3. 2006 年?A Study of the MD5 Attacks: Insights and Improvements?—— 創(chuàng)建一組具有相同 MD5 摘要的文件;

  4. 2008 年?MD5 considered harmful today?—— 創(chuàng)建偽造的 SSL 證書(shū);

  5. 2010 年?MD5 vulnerable to collision attacks?—— CMU 軟件工程機(jī)構(gòu)認(rèn)為 MD5 摘要算法已經(jīng)在密碼學(xué)上被破譯并且不適合使用;

  6. 2012 年?Flame?—— 惡意軟件利用了 MD5 的漏洞并偽造了微軟的數(shù)字簽名;

從過(guò)往的歷史來(lái)看,為了保證用戶敏感信息的安全,我們不應(yīng)該使用 MD5 加鹽的方式來(lái)存儲(chǔ)用戶的密碼,那么我們是否可以使用更加安全的摘要算法呢?不可以,哈希函數(shù)并不是專門(mén)用來(lái)設(shè)計(jì)存儲(chǔ)用戶密碼的,所以它的計(jì)算可能相對(duì)來(lái)說(shuō)還是比較快,攻擊者今天可以通過(guò) GPU 每秒執(zhí)行上億次的計(jì)算來(lái)破解用戶的密碼,所以不能使用這種方式存儲(chǔ)用戶的密碼,感興趣的讀者可以了解一下用于恢復(fù)密碼的工具?Hashcat。

加密

既然今天的硬件已經(jīng)能夠很快地幫助攻擊者破解用戶的密碼,那么我們能否通過(guò)其他的方式來(lái)取代哈希函數(shù)來(lái)存儲(chǔ)密碼呢?有些工程師想到使用加密算法來(lái)替代哈希函數(shù),這樣能夠從源頭上避免哈希碰撞的發(fā)生,這種方式看起來(lái)非常美好,但是有一個(gè)致命的缺點(diǎn),就是我們如何存儲(chǔ)用于加密密碼的秘鑰

既然存儲(chǔ)密碼的倉(cāng)庫(kù)能被泄露,那么用于存儲(chǔ)秘鑰的服務(wù)也可能會(huì)被攻擊,我們永遠(yuǎn)都沒(méi)有辦法保證我們的數(shù)據(jù)庫(kù)和服務(wù)器是安全的,一旦秘鑰被攻擊者獲取,他們就可以輕而易舉地恢復(fù)用戶的密碼,因?yàn)楹藢?duì)用戶密碼的過(guò)程需要在內(nèi)存對(duì)密碼進(jìn)行解密,這時(shí)明文的密碼就可能暴露在內(nèi)存中,依然有導(dǎo)致用戶密碼泄露的風(fēng)險(xiǎn)。



使用加密的方式存儲(chǔ)密碼相比于哈希加鹽的方式,在一些安全意識(shí)和能力較差的公司和網(wǎng)站反而更容易導(dǎo)致密碼的泄露和安全事故。

bcrypt

哈希加鹽的方式確實(shí)能夠增加攻擊者的成本,但是今天來(lái)看還遠(yuǎn)遠(yuǎn)不夠,我們需要一種更加安全的方式來(lái)存儲(chǔ)用戶的密碼,這也就是今天被廣泛使用的?bcrypt,使用?bcrypt?相比于直接使用哈希加鹽是一種更加安全的方式,也是我們目前推薦使用的方法,為了增加攻擊者的成本,bcrypt?引入了計(jì)算成本這一可以調(diào)節(jié)的參數(shù),能夠調(diào)節(jié)執(zhí)行?bcrypt?函數(shù)的成本。



當(dāng)我們將驗(yàn)證用戶密碼的成本提高幾個(gè)數(shù)量級(jí)時(shí),攻擊者的成本其實(shí)也相應(yīng)的提升了幾個(gè)數(shù)量級(jí),只要我們讓攻擊者的攻擊成本大于硬件的限制,同時(shí)保證正常請(qǐng)求的耗時(shí)在合理范圍內(nèi),我們就能夠保證用戶密碼的相對(duì)安全。

bcrypt?was designed for password hashing hence it is a slow algorithm. This is good for password hashing as it reduces the number of passwords by second an attacker could hash when crafting a dictionary attack. "

bcrypt?這一算法就是為哈希密碼而專門(mén)設(shè)計(jì)的,所以它是一個(gè)執(zhí)行相對(duì)較慢的算法,這也就能夠減少攻擊者每秒能夠處理的密碼數(shù)量,從而避免攻擊者的字典攻擊。

運(yùn)行上述?代碼片段?時(shí)就能發(fā)現(xiàn)?cost?和運(yùn)行時(shí)間的關(guān)系,算法運(yùn)行的成本每?+1,當(dāng)前算法最終的耗時(shí)就會(huì)翻一倍,這與?bcrypt?算法的實(shí)現(xiàn)原理有關(guān),你可以在?Wikipedia?上找到算法執(zhí)行過(guò)程的偽代碼,這可以幫助我們快速理解算法背后的設(shè)計(jì)。

如果硬件的發(fā)展使攻擊者能夠?qū)κ褂?bcrypt?存儲(chǔ)的密碼進(jìn)行攻擊時(shí),我們就可以直接提升?bcrypt?算法的?cost?參數(shù)以增加攻擊者的成本,這也是?bcrypt?設(shè)計(jì)上的精妙之處,所以使用?bcrypt?是一種在存儲(chǔ)用戶密碼時(shí)比較安全的方式。

總結(jié)

這篇文章分析的問(wèn)題其實(shí)是 —— 當(dāng)數(shù)據(jù)庫(kù)被攻擊者獲取時(shí),我們?cè)趺茨軌虮WC用戶的密碼很難被攻擊者『破譯』,作為保護(hù)用戶機(jī)密信息的最后手段,選擇安全并且合適的方法至關(guān)重要。攻擊者能否破解用戶的密碼一般取決于兩個(gè)條件:

  • 使用的加密算法是否足夠安全,使用暴力破解的方式時(shí)間成本極高;

  • 足夠好的硬件支持,能夠支持大規(guī)模地高速計(jì)算哈希;

抵御攻擊者的攻擊的方式其實(shí)就是提高單次算法運(yùn)行的成本,當(dāng)我們將用戶的驗(yàn)證耗時(shí)從?0.1ms?提升到了?500ms,攻擊者的計(jì)算成本也就提升了 5000 倍,這種結(jié)果就是之前需要幾小時(shí)破解的密碼現(xiàn)在需要幾年的時(shí)間。

不論如何,使用 MD5、MD5 加鹽或者其他哈希的方式來(lái)存儲(chǔ)密碼都是不安全的,希望各位工程師能夠避免在這樣的場(chǎng)景下使用 MD5,在其他必須使用哈希函數(shù)的場(chǎng)景下也建議使用其他算法代替,例如 SHA-512 等。

當(dāng)然,如何保證用戶機(jī)密信息的安全不只是一個(gè)密碼學(xué)問(wèn)題,它還是一個(gè)工程問(wèn)題,任何工程開(kāi)發(fā)商的疏漏都可能導(dǎo)致安全事故,所以我們作為開(kāi)發(fā)者在與用于敏感信息打交道時(shí)也應(yīng)該小心謹(jǐn)慎、懷有敬畏之心。到最后,我們還是來(lái)看一些比較開(kāi)放的相關(guān)問(wèn)題,有興趣的讀者可以仔細(xì)思考一下下面的問(wèn)題:

  1. 使用 GPU 每秒可以計(jì)算多少 MD5 哈希(數(shù)量級(jí))?能夠在多長(zhǎng)時(shí)間破解使用 MD5 加鹽存儲(chǔ)的密碼?

  2. 假設(shè)計(jì)算一次哈希耗時(shí)?500ms,破解?bcrypt?算法生成的哈希需要多長(zhǎng)時(shí)間?

  3. MD5 哈希?23cdc18507b52418db7740cbb5543e54?對(duì)應(yīng)的原文可能是?談?wù)勀闶褂玫墓ぞ吆推谱g的過(guò)程。

如果對(duì)文章中的內(nèi)容有疑問(wèn)或者想要了解更多軟件工程上一些設(shè)計(jì)決策背后的原因,可以在博客下面留言,作者會(huì)及時(shí)回復(fù)本文相關(guān)的疑問(wèn)并選擇其中合適的主題作為后續(xù)的內(nèi)容。


為什么 MD5 不能用于存儲(chǔ)密碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
岢岚县| 金乡县| 周口市| 晋宁县| 濉溪县| 东兴市| 江华| 平和县| 峨眉山市| 平定县| 宿州市| 阳新县| 射洪县| 子洲县| 固阳县| 无为县| 繁昌县| 开封市| 贺州市| 临沧市| 改则县| 彝良县| 萨嘎县| 简阳市| 安化县| 洪湖市| 建阳市| 安徽省| 阿鲁科尔沁旗| 沙洋县| 新田县| 博兴县| 武隆县| 武鸣县| 林州市| 高淳县| 永清县| 金昌市| 泗水县| 岳西县| 布尔津县|