注意:這不是我目前的實際情況。
假設您的老闆是那些老式的計算機文盲管理人員之一,並且希望以純文本形式存儲密碼以簡化開發。您有5分鐘的時間來解釋哈希密碼的要點。您還從經驗中知道,您的老闆可以被一個很好的類比所左右。您會用什麼比喻來向老闆解釋密碼應該被散列?
注意:這不是我目前的實際情況。
假設您的老闆是那些老式的計算機文盲管理人員之一,並且希望以純文本形式存儲密碼以簡化開發。您有5分鐘的時間來解釋哈希密碼的要點。您還從經驗中知道,您的老闆可以被一個很好的類比所左右。您會用什麼比喻來向老闆解釋密碼應該被散列?
簡短的答案是:“因此,您不會受到 500萬美元的集體訴訟提起訴訟。” 對於大多數首席執行官來說,這應該是足夠的理由。散列密碼便宜得多。
但更重要的是:僅按問題中的建議散列密碼是不夠的。您仍然會提起訴訟。您需要做更多。
為什麼您需要做更多的工作才能花一些時間來解釋。因此,讓我們走很長一段路,以便您了解所要解釋的內容,然後我們將為您提供5分鐘的摘要。
但是讓我們開始吧。假設您這樣存儲用戶的密碼:
#id:user:password1:alice:pizza2:bob:passw0rd3:carol:baseball
現在,例如,攻擊者設法獲得了比您想要的更多的系統訪問權限。在您發現問題並關閉孔之前,他只有35秒鐘的時間。但是在那35秒內,他設法鎖定了您的密碼數據庫。是的,您犯了一個安全性錯誤,但現在已將其修復。您修補了漏洞,修復了代碼,更新了防火牆,無論它可能是什麼。所以現在一切都很好,對吧?
好吧,不,他擁有您的密碼數據庫。
這意味著他現在可以模擬您系統上的每個用戶。您的系統的安全性遭到破壞。恢復的唯一方法是從新密碼數據庫重新開始,迫使每個人都使用其現有密碼作為有效的標識形式更改其密碼而無需。您必須通過其他某種方式(電話,電子郵件或其他方式)與他們進行帶外聯繫,以驗證其身份以重新創建其密碼,與此同時,您的整個操作陷入了困境。 >
如果您沒有看到他竊取密碼數據庫怎麼辦?回想起來,您幾乎不可能真正看到它的發生。您可能發現的方法是注意到多個用戶帳戶上的異常活動。也許幾個月來,好像您的系統根本沒有安全性,您不知道為什麼。這可能會破壞您的業務。
而不是存儲密碼,而是存儲密碼的哈希。您的數據庫現在如下所示:您存儲的是不透明的令牌,可用於驗證密碼是否正確,但不能用於檢索正確的密碼。
好吧,差不多。谷歌,那些哈希,我敢你。
所以現在我們已經發展到1970年代的技術。恭喜你我們可以做得更好。
我花了很長時間回答為什麼加鹽散列的問題,包括有關其在現實世界中如何工作的示例和演示。我不會在這裡重新散列哈希討論,所以繼續閱讀原始內容:
為什麼加鹽散列更安全? ,嗯?好的,所以現在我們知道我們必須加些鹽,否則我們可能永遠也不會哈希密碼。現在我們掌握了1990年代的技術。我們仍然可以做得更好。有關bcrypt和PBKDF2的內容?是的,事實證明這很重要。借助當今硬件可以進行哈希計算的速度(謝謝,比特幣!),擁有現成硬件的攻擊者可以在幾小時內瀏覽整個鹽化的哈希密碼文件,每秒計算數十億甚至數万億的哈希值。您必須放慢它們。
最慢的降低速度的方法就是讓它們做更多的工作。不必計算一個哈希值來檢查密碼,您必須計算1000。或100,000。或任何適合您的數字。您還可以使用 scrypt (“ ess-crypt”),它不僅需要大量的CPU能力,而且還需要大量的RAM來進行計算,因此上面我鏈接的專用硬件幾乎沒有用
這是當前的最新技術。恭喜並歡迎您使用今天的技術。
現在,當攻擊者獲取您的密碼文件時,會發生什麼情況。好吧,現在他可以離線進行分析,而無需在線猜測您的服務。不幸的是,除非積極地阻止用戶使用,否則相當一部分用戶(4%至12%)會使用密碼“ 123456”或“ password”,並且攻擊者將首先嘗試猜測它們。
如果要確保用戶安全,請不要讓他們使用“密碼”作為密碼。或其他任何500強,就此而言。 那裡有軟件,可以簡化(免費)準確的密碼強度計算。
但是,多因素身份驗證從來都不是一個壞電話。您可以輕鬆添加到任何項目。
您在老闆面前,他問您為什麼需要使用PBKDF2或類似產品對您的密碼進行哈希處理。您提到了LinkedIn集體訴訟,並說:“這是業界預期的最低法律安全水平。任何少的事情實際上都是疏忽。”這應該少於5分鐘,而且如果您的老闆不服氣,那麼他就不會在聽。
但是您可以繼續:“實施散列技術的成本可以忽略不計,而實施 的成本可能高達數百萬甚至更高。” “如果發生違規事件,經過適當整理的數據庫可讓您將自己定位為運行良好的安全意識組織,而對數據庫進行不適當的哈希處理則是非常公開的尷尬,正如歷史多次表明的那樣, 不是會被媒體絲毫忽略或忽略。”
如果您想獲取技術知識,可以重新整理上面的內容。但是,如果您正在與老闆交談,那麼您應該比這更了解。而且,類比的效果遠不止是表現出無需添加糖衣即可完美體現的真實生活效果。
通過講出一個很好的類比,您不會讓人戴上安全手套。相反,您將一些午餐肉放到燒杯中,當它在綠色和藍色火焰中爆炸時,您會說:“這將在您的手指上發生。”
在此處使用相同的原理。 >
首先,我將提供一個開頭:
假設您管理一家銀行。您不想讓您的客戶直接使用這筆錢。因此,您有一個出納員,只有一台電腦和少量的錢來處理日常的取款和存款。他無法訪問所有內容,也無法將機密傳遞給客戶,因為他無法訪問這些機密。搶劫銀行,他真的不會被櫃員阻止。為了解決這個問題,您的地下室裡有一個很大的保險箱,裡面存放著客戶的所有實物。這個保險箱有很多安全裝置,例如指紋掃描儀,語音識別,壓力開關,三鍵鎖和定時鎖。它的目的是將不應該出現的人和不知道如何通過安全保護的人拒之門外。
此保險箱可以阻止99%的強盜,但總有1%通過繞過或殘酷性地設法克服了所有安全性。萬一發生這種情況,銀行會將其貨幣存儲在誘餌誘捕的容器中,這會使貨幣無法使用,例如將其炸掉或在上面噴塗油漆。這樣,強盜要么無法使用這筆錢,要么需要花費很長時間才能使這筆錢再次可用。
一個軟件應用程序也具有以下系統:用戶使用的程序是出納員:他無法使其做任何想要的事情,除非他找到了一種甜言蜜語的合作方式。保護程序和數據庫的硬件和軟件配置就是銀行保險庫:它使那些不知道所使用的安全配置的弱點的人無法使用。以明文形式存儲密碼意味著,如果有人通過了程序和安全配置,則他可以自由訪問密碼。就像銀行將錢存放在一個使錢更難使用的容器中一樣,對密碼進行哈希處理會給破壞密碼的人帶來巨大的障礙。這也意味著,員工(銀行,軟件以及我們自己公司的員工)都不會受到壓力,脅迫或甜言蜜語地繞過騙子的安全性,因為他們甚至無法直接訪問金錢/密碼。他們只能訪問容器/哈希。
我喜歡用類比作為解釋技術的一種方式,但是在這種情況下,由於類比太複雜了,因此可能不可行。
大多數經理比做正確的事更有動力來避免對自己的職位造成人身風險,因此,我將使用一個例子來比喻一個例子,在該例子中,以純文本形式存儲密碼對公司造成了嚴重影響,而不是一個類比。我只想說
之類的東西“以純文本格式存儲密碼會使我們看起來很糟糕,冒著聲譽風險,甚至有可能公開接受訴訟。在任何行業中,這都是非常糟糕的做法,因此個人網站,我不想成為站在董事會/老闆/ CTO面前的人,解釋為什麼我們沒有實施基本的安全控制措施。如果我們對客戶的密碼進行哈希處理,那麼數據洩露將不會立即導致黑客可以使用的密碼洩漏,並且我們將被視為在保護客戶的信息。哈希密碼可以減輕很大的風險,而無需付出任何努力。”
包含與純文本違法者的鏈接,然後將喜歡的消息發送給諸如 Cupid Media, Microsoft India Store等新聞報導
使用類比功能可能很強大,但是在這種情況下,我認為用簡單的語言解釋發生的情況會容易得多。像這樣的東西應該是有效的,但可能應該包括帶有插圖和大型公司字體的PowerPoint幻燈片。使用我們的產品。為了讓人們登錄,我們必須跟踪這些密碼。問題是,我們無法完全按照輸入的密碼來存儲密碼,因為攻擊者已經找到了能夠看到和竊取密碼的方法。
我們也不能只用一個聰明的代碼重寫密碼,並相信我們將是唯一知道如何翻譯代碼的人,因為那仍然不能保證堅定的攻擊者無法弄清楚代碼,並且也無法防止組織內部的攻擊,例如流氓前僱員。
為解決此問題,我們必須使用單向密碼哈希。密碼哈希類似於使用代碼,只是無法解密。*這樣,只有用戶知道他或她的密碼。我們僅存儲密碼的哈希值,並在用戶登錄時進行檢查。這可以保護我們的用戶安全,並減少數據洩露(可能造成嚴重後果)時的責任。 [包括因不安全的密碼存儲而被起訴的公司的例子]
* [我知道這並非不可能,但外行可能並不需要那麼多詳細信息。]
到目前為止,所有的解釋都有些長,下面是一個簡短的解釋:
有些不記得自己的銀行密碼的人,在他們的錢包裡放了張鈔票。
如果小偷或熟識的人會發現錢包有問題,除非他們以無法閱讀的方式寫圖釘。
散列基本上是以一種方式寫文本沒人能讀。
想像一下您是俱樂部的保鏢。要知道是否允許人們進入,您有一本人名/別名的密碼本(有些人更喜歡謹慎,只有被人知道別名)和自己的私人密碼;您無法通過聲音或外貌來認出他們是或不是他們所說的人(人太多,而且由於別名,ID檢查是不行的),所以您只需要去(Web服務器無法通過看著你來判斷你是錯誤的人)。人們必須告訴您他們的名稱和密碼才能進入,如果與您的書不符,他們就會被拒之門外。
如果有人得到您密碼本的圖片(您的數據庫已洩漏),他們可以冒充任何他們想模仿的人,而您卻無法告訴他們他們在說謊。您的一些客戶在他們的銀行也使用相同的名稱和密碼(他們的出納員就像您一樣使用密碼本),因此他們會被盜錢。然後,您會因為允許這樣的重大違規而被解僱,使俱樂部看起來非常糟糕,並為此付出了金錢。 ,其名稱為(salt)和密碼,並為您提供一個隨機的長號(hash),該數字始終與給定的名稱和密碼,對於名稱和密碼的任何其他組合則不同。因此,現在您的密碼本可以不再包含[名稱和密碼],而只需包含[名稱和密碼]!當某人想要進入時,他們會告訴您他們的名稱和密碼,然後將其輸入到黑匣子中,然後在密碼本中查找他們的名字,以檢查黑匣子為您提供的號碼是否與記錄的黑匣子相匹配。
現在,如果有人得到了您的密碼本的圖片,他們仍然無法進入!,他們甚至無法判斷您一半的人是否使用相同的密碼,因為輸入到黑匣子中的每個[名稱和密碼]組合都是唯一的。他們像您一樣有一個黑匣子,可以輸入一定的名稱和隨機密碼,直到找到正確的數字為止,但是他們必須分別為每個人這樣做。
如果發現洩露後,您仍然應該讓客戶更改其密碼以最大程度地提高安全性,但攻擊者將很難輕鬆進入。
很顯然,您將盡一切努力確保代碼安全。但是事實是,您的服務器不僅會運行您編寫的代碼,而且您無法控制其他人編寫的代碼。即使計算機上的所有其他代碼都是開源的,您也需要雇用2-3個全職開發人員來負責您自己的所有分支。既然-讓我們自己開玩笑-這整個事情應該被認為是一項削減成本的措施,那是不可行的方法。
因此,即使您對自己的代碼絕對有信心,仍然有很多地方可以出錯。因此,您需要一種方法來確保即使攻擊者進入計算機,您的密碼仍然是安全的。這就是“散列”(用引號引起的,因為在當今時代使用的適當算法本身並不是真正的“散列” 算法,但它仍然是一個非常有用的籠統術語)發揮作用的地方
用軍事術語來說,本質上就是(如何)建立多道防線。沒有哪位將軍將整個軍隊置於同一位置,因為您需要考慮未預見到的某些事情會導致您的前線被擊敗或繞過的可能性。散列是您的家庭警衛:當其他所有操作失敗時,它將保護您的密碼的事情。您希望永遠不需要它,但是在需要時不提供它的代價太高了:數百萬美元的訴訟只是開始。
如何解釋。
因此,以明文形式保存密碼是一種威脅。任何人都可以閱讀。
一旦對密碼進行散列,實際上就可以了。不可能找回來。因此,不必擔心您的密碼會被他人竊取。
密碼哈希的缺點是:沒有人可以檢索原始通行證。在這種情況下,系統必須要求用戶輸入新密碼
。
單向哈希函數與非技術人員的最佳類比就是僅使用數字查找打個比方-忘記複雜的密碼學。當用戶最初為您提供密碼時,您會使用黑框為該密碼分配一個唯一的數字,然後將該數字存儲為用戶的密碼,而不是原始密碼。
當用戶稍後再次向您提供密碼進行身份驗證時,您會將給定的密碼傳遞到黑盒中並獲取一個數字。現在,您可以將該數字與之前保存的數字進行比較-如果兩個數字匹配,則密碼相同;如果兩個數字不匹配,則密碼也不相同。
每個唯一密碼傳遞到盒子中的將獲得其自己的唯一編號,並且每次將相同的密碼傳遞到黑盒中時,都會出現相同的數字。
黑盒進行數字查找的方式眾所周知,並且黑匣子的任何問題都由行業解決-任何漏洞由行業解決-如果黑匣子有問題,您的公司不承擔任何責任。
最後,如果數字是從公司數據庫中盜取的,那麼,易於理解的黑匣子也不能正常工作-您不能拿走被盜的數字並找回密碼(假設原始密碼很強)。
最根本的答案(我還沒有看到任何人直接聲明過)是,不能將能夠發現密碼的任何人的行為與合法所有者的行為可靠地區分開。如果希望能夠證明合法所有者執行了某項操作或通過自己的行為將密碼暴露給了未經授權的人,則必須確保絕不要求合法所有者做任何讓他人確定的事情。密碼。
如果Fred的密碼存儲在數據庫中的方式沒有被破壞,無法恢復,那麼Fred可以聲稱自己的密碼可能已被他人使用或洩露,以此來反駁任何不當行為。訪問密碼數據庫。 除非使用專門的硬件存儲密碼,否則將無法反駁Fred的反訴。
請注意,出於真正的安全考慮,Fred絕不應將其密碼暴露給其他任何東西。而不是他有理由信任的防篡改設備。否則,就有可能會以某種方式篡改Fred鍵入密碼的設備,從而將未散佈的密碼洩露給某些對手。
假設您是 Scrooge McDuck。您已經將您的一大堆錢保存在一個大型保險庫中已有一段時間了,但是這樣做有一個問題:如果一個小偷能夠進入保險庫,那麼您的所有金錢將一口氣丟失!不好因此,您就是聰明的鴨子,您決定將您的錢分成許多小堆,然後將每個堆放在自己的單獨保險庫中。現在,如果小偷獲得了使用一個保管庫的權限,則只會損失一小部分錢,您可以輕鬆地更換受損的保管庫。好多了!除了現在,您還有一個新問題:如何記住所有這些不同保管庫的組合?您不能只為每個人使用相同的組合,因為如果小偷得到了他們的幫助,他們將有機會使用您的所有資金,而且與將其留在一個巨人中一樣,您的生活也不會比這更好
您決定只在一張紙上寫下所有組合(以及每個人要使用的文件庫),然後將其放在單獨的文件庫中。現在,您只需要記住一種組合,但是您的錢仍然分開存放。這是一種改進,但仍然存在問題,因為如果小偷設法設法找到並用紙夾住了保險箱,他們就會仍然拿走你所有的錢。你不希望這種事情發生!
那你怎麼辦?好吧,理想的解決方案是用某種代碼寫下組合。您想要一個代碼,小偷不能使用它來找回所有原始組合,但是您仍然可以使用它來獲取您的資金。不幸的是,實際上沒有一種方法可以在金庫中賺錢。幸運的是,受密碼保護的用戶帳戶 是可能的,因為我們實際上不需要知道用戶的密碼-我們只需要知道他們即可。
將錢存入一個巨大的保險箱中,就像為整個系統使用一個主密碼一樣。將錢存放在不同的保險箱中並記下所有組合就像將用戶的數據保存在受密碼保護的帳戶中一樣,然後將所有密碼以純文本格式保存在一個位置:只要攻擊者知道或可以猜測該位置是的,它與擁有一個主密碼並沒有什麼不同。您需要一種對密碼列表進行編碼的方式,以便仍然可以使用它來驗證用戶是否具有正確的密碼,同時確保攻擊者無法使用列表以獲取密碼本身。簡而言之,這就是哈希的作用。
假設您的密碼數據庫已洩漏或被盜:
如果密碼為純文本格式,則您的所有密碼均屬於我們。
如果密碼為散列,則全部密碼仍在必須破解的共享銀行保險庫中。
如果密碼經過哈希處理和添加鹽分,則每個密碼都在其自己的私人銀行保險庫中。
分析時間:
沒有人應該實際上根據類推來決定安全事項,但是這些可能有助於向外行人解釋為什麼採取預防措施很重要。
對於哈希函數,沒有現成的類比可以在足球或汽車領域找到自己。我們能做的最好的就是洩漏實際情況。 )兩個或多個不同站點或服務的密碼。在那個完美的世界中,密碼對於攻擊者而言幾乎沒有任何價值。在破壞了用戶數據庫並學習了密碼之後,這些密碼對於訪問其他系統將毫無用處。
在現實世界中,用戶會重複使用密碼,因此密碼的保密性必須繼續
散列有助於保護密碼,因為從散列中獲取密碼的唯一方法是蠻力計算,這需要時間。該計算將首先破解短密碼或基於詞典單詞和常用短語的弱密碼。破解強密碼需要花費更長的時間,但是如果有足夠的時間,這些密碼也將掉落。密碼或使用類似的密碼,在攻擊者嘗試訪問其帳戶之前,可能有足夠的時間被警告並在其他系統上更改其密碼。 (不幸的是,那些密碼非常弱的用戶幾乎沒有時間,因為弱密碼會很快從哈希中“破解”。系統中的防護措施是防止用戶使用弱密碼。) >沒有散列,攻擊者可以在從受感染系統竊取密碼後立即繼續訪問其他系統。到管理員甚至了解該漏洞時,至少對於那些重複使用密碼的用戶,其他系統已經可以訪問。
還有第二個威脅:秘密訪問的威脅。這甚至影響那些不重複使用密碼的用戶。假設系統的密碼數據庫已洩漏,但是未檢測到此事件。攻擊者可以在破解後數月或數年內使用密碼秘密訪問系統。攻擊者不僅可以竊取事件發生時的最新信息,而且只要不更改密碼即可登錄到擁有密碼的帳戶,從而可以繼續竊取信息。
散列密碼有助於防範這種威脅,特別是與常規密碼更改和強密碼策略結合使用時。密碼強度高,確保攻擊者必須執行冗長的計算才能從哈希中發現密碼。密碼更改策略有助於確保在計算完成時,發現的密碼可能已經無用,因為它已被更改。
類比:作為一個鎖匠,我可以(在得到客戶許可的情況下)保留我為他們所做的工作的記錄,包括他們的鑰匙的詳細信息。但這使我冒著闖入自己的商店並偷竊清單的風險(或這樣做是邪惡的僱員)-在這種情況下,騙子可能會為許多房屋製造鑰匙,我將為此承擔責任信息更好。
密鑰的解決方案是永遠不要以明文形式存儲密鑰信息。對其進行加密存儲,切勿寫下解碼此數據所需的信息。如果有人竊取了加密的列表,則不會對其造成任何損害。
當然,對於計算機,“永不寫下”將意味著它無法解碼密碼。但是,我們可以通過創建一個實際上無需解碼它們的系統來解決該問題。取而代之的是,我們獲取用戶鍵入的密碼,對其進行編碼,然後將編碼版本與我們存儲的編碼密碼進行比較。如果它們匹配,則用戶鍵入正確的密碼。有一些“代碼”(密碼散列)允許編碼但不能解碼,因此可以確保其安全性。
有時仍然可以破解散列的密碼列表,但這樣做的成本高得多- -而且重要的是,您可以證明您在保護用戶數據方面做出了合理的努力,因此您承擔的責任少得多。
散列的技術重要性被高估了。
您需要散列的實際原因是因為其他所有人都在進行散列。它被認為是“最佳實踐”。如果您有違規行為,則可以很容易地捍衛與同行一樣的職位。即使做對了,做些不同的事情也很難捍衛。因此,即使我認為網站很笨拙,我也始終建議網站遵循標準的哈希方法。
那麼,為什麼哈希的重要性被高估了?讓我們首先考慮一個使用非哈希密碼的網站。密碼將以純文本格式存儲在數據庫中。數據庫是安全的-在物理安全的服務器上,全盤加密,防火牆,安全管理中,並且受到Web服務器上應用程序邏輯的保護。這些密碼基本上是安全的。
我們為什麼要完全散列?它提供了最後一道防線。假設所有這些防禦措施都受阻。美國國家安全局(NSA)可能使用了零日瀏覽器漏洞,將惡意軟件從sys-admin的工作站上獲取,等待他登錄數據庫,然後從那裡進行了遠程控制,並提取了所有數據。在這種情況下,NSA將獲得所有明文密碼。這就是哈希的作用所在:如果您使用哈希,則NSA只會獲取哈希,並且他們必須進行蠻力攻擊才能獲取密碼。
這就是人們推薦哈希的原因。但這有缺陷,原因有以下三個:
個人數據-該網站保存您的密碼,同時還保存個人數據。無論是消息,照片,購物記錄。首先使用密碼的原因是為了保護您的個人數據。散列可以保護密碼,但不能保護您的個人數據。
實時捕獲-儘管數據庫中僅存儲散列,但每次有人登錄時,其密碼都會發送到Web服務器。 NSA可以靜靜地坐在服務器上,以捕獲每個人的密碼。散列並不能阻止這種情況。
密碼重用-出於其他原因,避免密碼重用很重要。因此,當LinkedIn被黑客入侵時,無論是否獲得我的密碼都無關緊要。黑客已經從LinkedIn獲得了我的個人數據。並且,如果他們恢復了我的密碼,則僅使他們可以訪問LinkedIn,並且他們已經擁有該數據。
鑑於所有這些,密碼哈希的好處是微不足道的。我不知道為什麼InfoSec社區會繼續進行密碼哈希處理,首先集中精力防止數據庫洩露會更明智。通常,散列的成本相對較低,但是有一個例外:高度迭代的散列。這樣的技術成本很高,而收益卻很低,因此,這種建議被嚴重誤解了。儘管如此,我還是建議人們遵循它,因為這是“最佳實踐”。
告訴老闆的事情:“這是問題所在。我是一位經驗豐富的軟件開發人員,我告訴您,在絕對不可原諒的愚蠢程度下,存儲未加密的密碼是有風險的。即使在存儲無鹽密碼的情況下,也存在風險我已經告訴過你了,你可以命令我存儲未加密的密碼,我會這樣做的,但是如果遇到麻煩,我會告訴任何想听這不是因為我不稱職的人,但是因為您命令我在認真的建議下這樣做,因此,我保證您將承擔個人責任,並且您之後將有律師要求您付出每一分錢自己。