題:
哈希如何工作?
Griffin Nowak
2013-04-07 02:14:46 UTC
view on stackexchange narkive permalink

我對信息安全感興趣。最近向我介紹了哈希的概念。我目前對散列的了解是,它採用了用戶輸入的密碼。然後,它使用一堆變量並加擾所有內容,隨機生成一個“哈希”。然後,當您輸入此密碼進行登錄時,它將使該密碼與哈希匹配。我只有幾件事我不了解。

  1. 為什麼很難破解這些哈希?我假設一旦找到了他們用來加密的方法(一旦找到要轉換的書數,就可以使用凱撒的密碼之類的極其簡單的方法)。即使它使用了諸如時間和混亂之類的東西,也有一些非常大的方法可以限制選擇(讓我們使用Caesar密碼,他們正在使用year mod x,您已經知道現實中可能有兩個年份,那麼您只需要弄清楚第二個年份的難題)。

  2. 如果它們是隨機生成的(即使兩個密碼是相同的,它們也會以不同的方式出現),它們如何判斷是否正確?

  3. 他們如何破解。哈希貓如何知道何時已成功解密密碼?

  4. ol>

    相關視頻(但不能完全回答我的問題): https://www.youtube .com / watch?v = b4b8ktEV4Bg

作為對Q(3)的微小回答,更具體地說,像oclHashcat這樣的程序在大多數情況下會嘗試在預定列表中數百萬個哈希。他們從不實際“解密”密碼(請記住,您只能解密加密-哈希!=加密),但是他們知道如果他們嘗試輸入密碼並且所產生的哈希值與密碼相同,則該密碼必須是原始密碼。即他們不會解密,而是每秒進行數百萬次試錯,以查看是否可以找到匹配項。這就是為什麼哈希值變慢也很好的原因。
@Peleus這很像我的意思。我唯一想到的是,在對密碼進行哈希處理時,他們會隨機對其進行加密。他們如何獲取密碼並以相同的隨機動作對其進行重新加密。如果相同的輸入可以給出不同的輸出,那也會令我感到困惑。
我不確定您是不是在說“我以為他們是隨機打亂的”,就像您現在學到的有所不同,但是請您一定知道事實並非如此!散列不是隨機的,而是可重複的-但僅此而已就不可能向後工作。 “ cat”一詞的SHA256散列在100%的時間內始終相同。這就是為什麼我們可以可靠地將其用作密碼。如果哈希每次都產生一個新值,並且我們只能與之前的哈希值進行比較,那麼我們永遠不會知道密碼是否正確! :D
我知道了。該視頻準確地解釋了我想知道的內容。 http://www.youtube.com/watch?v=vgTtHV04xRI
更好的視頻說明了為什麼使用哈希。與以上解釋RSA加密的原因不同,為什麼它很難在哈希表上向後退。 https://www.youtube.com/watch?v=b4b8ktEV4Bg
請不要在密碼上使用一種標準的哈希算法(例如SHA256或較舊的SHA1或MD5),然後再存儲哈希。您總是希望使用[salt](https://security.stackexchange.com/questions/14025/why-is-using-salt-more-secure)和較慢的哈希算法來實現此目的。正是出於此目的而製作了[bcrypt](https://en.wikipedia.org/wiki/Bcrypt)之類的東西。
五 答案:
Gilles 'SO- stop being evil'
2013-04-07 02:54:04 UTC
view on stackexchange narkive permalink

快速,係數1081。

或者,如果您願意,回答這個問題:47是23乘以47?

哪個更容易?執行乘法(僅機械地遵循規則)要比僅給定乘積的操作數恢復要容易。乘法。 (順便說一下,這是諸如 RSA之類的某些密碼算法的基礎。)

密碼哈希函數 具有不同的數學基礎,但是它們具有相同的屬性:它們很容易向前計算(在給定x的情況下計算H(x)),但實際上不可能進行向後計算(給定y,計算x使得H(x)= y)。實際上,良好的密碼哈希函數的標誌之一就是找到x的方法沒有比嘗試所有x併計算H(x)直到找到匹配項更好的方法。

哈希函數是兩個不同的輸入具有不同的哈希值。因此,如果H(x 1 sub>)= H(x 2 sub>),我們可以得出x 1 sub> = x 2 sub >。從數學上講,這是不可能的-如果輸入的長度大於哈希的長度,則必鬚髮生衝突。但是具有良好的密碼哈希函數,沒有找到與世界上所有計算資源發生衝突的已知方法。

如果您想了解更多關於密碼哈希函數的信息,請閱讀 Thomas Pornin的答案。繼續,我將等待。

請注意,哈希函數不是加密函數。加密意味著您可以解密(如果您知道密鑰)。有了哈希,沒有神奇的數字可以讓您返回。

主要推薦的加密哈希函數是 SHA-1 SHA-2系列(具有多種輸出大小,主要是SHA-256和SHA-512) 。 MD5是較老的版本,由於已知衝突而已棄用。最終,沒有任何數學證據證明它們確實是很好的加密哈希函數,只是一種普遍的看法,因為許多專業密碼學家花費了數年的時間嘗試並且失敗了以破壞它們。

好吧,這就是一個故事的一部分。現在,密碼哈希不是直接的密碼哈希函數。密碼哈希函數(PHF)接受兩個輸入:密碼和鹽。 是在用戶選擇密碼時隨機生成的,並與哈希密碼PHF(密碼,鹽)一起存儲。 (重要的是,兩個不同的帳戶始終具有不同的鹽,並且隨機產生足夠大的鹽是獲得具有極大可能性的此屬性的好方法。)當用戶再次登錄時,驗證系統將從密碼數據庫中讀取鹽,計算PHF(密碼,鹽),並驗證結果是否存儲在數據庫中。

鹽的意義在於,如果有人想破解密碼,他們會在開始之前必須先了解哈希值,並且他們必須分別攻擊每個帳戶。鹽使得不可能提前進行很多裂解工作,例如通過生成彩虹表

這將回答(2)和(3)-合法驗證者和攻擊者以相同的方式找出密碼(由用戶輸入或由攻擊者猜測)是否正確。故事的最後一點:好的密碼哈希函數還具有其他屬性,它必須很慢。合法服務器只需要在每次登錄嘗試時計算一次,而攻擊者則必須在每次猜測時計算一次,因此,這種緩慢性會給攻擊者帶來更大的傷害(這是必要的,因為攻擊者通常擁有更多的專用硬件)。

如果您需要對密碼進行哈希處理,請不要發明自己的方法使用一種標準方法 scrypt bcrypt PBKDF2

我該死的是從其他所有人那裡來到安全站點的,很明顯的一件事是,你們在回答問題上花費了大量的精力。不僅正確,而且非常徹底。我希望我可以選擇兩個答案,但您的答案更像我想要的。
@Griffin-不過,您可以同時投票。或者的確-當答案多於兩個時-投票贊成您認為它們很有幫助的所有內容,即使您只能接受一個。這裡的許多問題都有一個以上的好答案,有時甚至建議您閱讀大多數答案,以更好地理解手頭的話題。是的,有時甚至是票數低的人。通過投票(無論哪種方式),您還可以幫助未來的讀者確定答案的有效性,尤其是那些仍在學習某個主題的讀者。 ;)
我都投票了!它們非常有用。
+1:所有答案都很好,但是這個答案與我在Stack Exchange上見過的_perfect_答案差不多。如果可以的話,將+10。
-1
@TildalWave因此,鹽醃法不是用來保護它的,它只是用來使其獨特嗎?
@Griffin防止重複使用工作。如果兩個用戶使用相同的密碼並且您沒有密碼,它將產生相同的哈希值。如果攻擊者通過正確猜測來破解一個用戶密碼,則他現在擁有使用該相同密碼的所有用戶密碼。通過為每個用戶添加隨機鹽,攻擊者將無法重用他對下一個用戶的先前猜測。
Thomas Pornin
2013-04-07 02:33:29 UTC
view on stackexchange narkive permalink

密碼哈希函數是數學對象,可以描述為“某些位的大量混合和加擾”。它們將一系列位(可能是一個很長的位)作為輸入,並提供固定大小的輸出。粗略地講,它們是如此糾結,以至於儘管它們沒有什麼秘密(這只是確定性代碼),但是沒有人知道如何“反轉”它們(為給定輸出找到匹配的輸入),除非被稱為“運氣”的基本方法。 “:嘗試隨機輸入,直到找到匹配項為止。

從科學上講,散列函數完全可以存在是怎麼回事一個好問題

散列不是加密。哈希沒有秘密,沒有密鑰。

哈希函數有很多用途;其中之一是“密碼存儲”。哈希函數對於密碼存儲來說似乎是一件好事。我們不想直接存儲密碼(否則,攻擊者偶爾會偷看我們的數據庫會給他太多信息;請參閱此博客文章進行討論);我們要存儲密碼驗證令牌:一種用於驗證密碼(由用戶提供)但不透露密碼本身的東西。因此,想法是:讓我們存儲密碼的哈希值。當要驗證密碼時,我們只計算其哈希值,看看它是否與存儲的值匹配。但是僅憑哈希值猜測密碼很難,因為哈希函數可以抵抗“反轉”(見上文)。

因為密碼是一種特殊的數據(人類可以記住的數據) ,為了獲得適當的安全性,我們需要一個“增強型”哈希函數:

  • 我們需要一個非常慢的哈希函數。
  • 我們不希望使用一個哈希函數,而希望使用許多個不同的哈希函數,因此每個密碼都將使用其自己的哈希函數進行哈希處理;這是關於阻止並行攻擊。將單個哈希函數轉換為多種變體的過程稱為 salting

請參見此答案以全面了解該主題哈希密碼。

抱歉,雖然您的答案非常徹底且合理,但我發現另一個答案更像我想要的答案。
Kaz
2013-04-07 09:58:31 UTC
view on stackexchange narkive permalink

散列是從某個位字符串(通常是可變長度)到另一個位字符串(通常是較小且具有固定長度)的函數。

散列用於數據庫中的數據檢索以及in-內存數據結構稱為哈希表。它使我們能夠將任意數據(例如字符串或具有多個字段的複雜對象)簡化為二進制數,然後可以將其直接用作稀疏數組的索引以獲取關聯的數據(具有一些用於處理哈希的​​詳細信息)

以上述方式使用的哈希函數是密碼哈希函數的“表親”。它們針對不同的要求而設計。它們必須快速計算並獲得良好的分佈。

在安全計算中,使用加密哈希將數據消化為一些有代表性的小比特串。密碼功能有不同的要求。它們被設計成難以反轉(成為“活板門”或“單向”功能)。不僅如此,一個重要的要求是,對於給定的純文本和哈希值,必須很難找到另一個產生相同哈希的純文本。

哈希不僅可以用於密碼,但作為校驗和以驗證數據完整性,也作為數字簽名實施的一部分。要對大型文檔進行數字簽名,我們只需要對文檔進行哈希處理就可以產生一個“摘要”(當對很長的內容進行哈希處理時,該名稱用於哈希函數的輸出)。然後,僅將此摘要通過公鑰密碼系統生成簽名。您可以在其中看到缺點:如果攻擊者成功生成摘要相同的文檔,該怎麼辦?然後,看起來好像是在真實文件上產生的原始簽名實際上是偽造文件的簽名:簽名轉移偽造已得到有效實施。

密碼哈希允許系統不存儲密碼的純文本版本,但使系統能夠驗證試圖獲得輸入的用戶是否知道該密碼。散列不僅允許系統不存儲純文本密碼(必須非常謹慎地加以保護),而且還允許即使散列是公開公開的,密碼仍然是安全的(類似於公鑰加密方式)系統能夠公開公鑰)。儘管在實踐中,哈希仍然受到公共訪問的保護:例如,在類Unix系統上的 / etc / shadow 文件,補充了世界可讀的 / etc / passwd 文件。 / p>

散列函數不是隨機的。但是,可以採用隨機方法來阻止攻擊者建立大量的密碼和哈希字典,使他們能夠查找哈希碼並檢索相應的密碼。

要更安全地哈希密碼,我們可以簡單地添加它的一些隨機位稱為“鹽”。當然,將不同的鹽添加到同一密碼中會導致產生不同的哈希值(希望衝突很少或沒有衝突)。

如果隨機鹽的寬度為32位,那麼從理論上講,這意味著一個密碼可以以40億種不同的方式進行哈希處理,因此,預先計算所有可能的哈希值的字典非常不切實際

當然,當用戶通過身份驗證時,她對這種鹽一無所知。可以,因為鹽與哈希一起存儲在用戶的配置文件中(通常與哈希一起存儲在單個緊湊的位串中)。驗證用戶的密碼輸入後,會將鹽添加到她輸入的任何密碼中,以便使用正確的鹽進行哈希處理。如果密碼正確,則哈希將匹配,因為使用的鹽也是正確的,已從用戶的配置文件中提取出來。

這就是將隨機性結合到密碼哈希中的方式,同時仍然允許它起作用。

讓哈希難以破解的原因是哈希是由“陷阱門”或“單向”功能構建的。在數學中,有很多這樣的例子。例如,簡單的加法就是活板門。如果我們加一些整數來產生一個總和,就不可能只知道總和就恢復原始數字。

密碼散列不是加密的密碼。如果攻擊者擁有密碼的哈希值和鹽值,並且碰巧猜出了密碼,那麼她可以輕鬆地確認身份,就像登錄驗證器軟件所做的一樣:她通過哈希函數運行密碼加鹽值,然後看到正確的哈希出現了。

出色的寫作技巧和一個非常容易理解的答案,儘管實際上是正確的,但卻能處理所有要點,並保持自然的流向,因此變得更加全面。這並非易事,非常感謝您的回答!
非常有用。您涵蓋了所有方面。
tylerl
2013-04-10 02:00:02 UTC
view on stackexchange narkive permalink

散列的關鍵之一是它會丟棄信息。您無法反轉哈希,因為必要的知識已經消失了。這是一些可行(但很不值錢)的哈希函數的示例。如果您給我密碼,我可以執行以下操作之一:

  • 計算元音的數量
  • 對每個字母取ASCII碼並將它們全部異或
  • 獲取密碼的二進製表示形式的CRC32校驗和(這實際上是一個真實的散列,而不是加密的散列)

在每種情況下,我都無法撤消該過程。相反,當您稍後再次給我密碼時,我必須重新運行該過程,以查看我運行的計算是否匹配。

例如:如果您最初給我輸入密碼“ monkey”,我可能會存儲數字3(3個元音)。然後,稍後當我嘗試對密碼“ dragon”進行身份驗證時,我再次運行相同的檢查並給出不匹配3的2。因此,我知道您給了我錯誤的密碼。但是,如果您給我密碼“ melissa”,我會錯誤地認為您輸入了正確的密碼。這是一個哈希衝突

您用來表示代表給定密碼的數字的規則集是您的哈希函數。這些功能被認為是“單向”功能,因為您不應將它們反向。高質量的哈希函數旨在限制潛在衝突的次數,因此您不必擔心該問題。更進一步,加密散列函數旨在使難以提出可能與給定輸出匹配的字符串(並可能有意產生衝突)。它們還旨在限制您可以從哈希輸出中收集有關給定輸入的信息量。

因此,判斷哪種密碼與給定的密碼哈希匹配的唯一方法是嘗試所有可能性,直到偶然發現可行的可能性。進一步的對策(鹽,BPKDF2等)使每次猜測密碼的人都越過更多的障礙,使這一猜測過程變得更加困難。很難拿出有效的密碼(即使它不是原始密碼)。這稱為“ 原像攻擊”。在上述瑣碎的示例中,使用“ melissa”作為包含3個元音的候選密碼就是這種攻擊的示例。

加密散列函數通常通過在給定進程的多個“回合”中運行輸入來完成此操作,其中每個回合的輸出都成為下一回合的輸入的一部分。要弄清楚第一輪的輸入,您必須弄清楚第二輪的輸入,這又需要您弄清楚第三輪的輸入,依此類推,這意味著每個組件的每個猜測必須通過一系列漫長而復雜的計算進行檢查。托馬斯·波寧(Thomas Pornin)對這種抵抗是如何工作的有一個詳盡的解釋;如果您想真正理解它,這將非常有用。

KeithS
2013-04-10 04:50:27 UTC
view on stackexchange narkive permalink
  1. 確定滿足以下方程式的z的常數:xy ^ 7 + yz ^ 5 + x ^ 3z = 0。 OK,x =32。仍然無法解決嗎?然後,您不應該首先知道答案。

    y的值將把它簡化為一個單變量方程,從而使該變量對於任何六年級的學生來說都是微不足道的(可能需要計算器),這是我僅分享的一個秘密與我信任的人在一起。沒有它,z可能是任何東西;它的值取決於y,因此如果沒有已知的y常數就無法令人滿意地求解。如果您不知道y的值,那是因為我對您的信任不足,無法私下將其提供給您。

    這是密碼學的基本原理;數學公式或其他確定性過程已得到充分證明,並且該公式的一個或多個可能變量也已公開,允許兩方就建立密碼的方式達成共識,以便雙方可以解密對方加密的內容。然而,兩個變量仍然是秘密的。如果您知道一個,就可以發現另一個。您應該知道的一個是密鑰,而您可以通過該密鑰發現的一個是消息。

    對於哈希,這有點不同。散列不需要保留一個秘密即可保留另一個秘密。相反,哈希是基於不可逆的數學轉換來進行的;對於任何H(x)= y,沒有已知的H -1 sup>(y)= x,只是對所有可能的x嘗試H(x)直到得到y。通常,這是因為方程的幾個中間結果是模棱兩可的。例如,計算一個正數的平方根在技術上會產生一個正數和負數的結果,因為兩個數都可以乘以它本身來產生結果。模的倒數類似地是模棱兩可的。 x mod 3產生的數字1可以由任何x = 3k + 1產生。這些類型的“單向”轉換以這樣的方式組合:嘗試計算逆哈希函數會產生無限的可能性。因此,解決這些問題的更簡單(最簡單)的方法是簡單地嘗試所有可能的輸入,直到一個輸出匹配為止。這仍然需要很長時間。

  2. 哈希不是隨機的。如我先前所述,哈希是不可逆數學運算的結果。該操作必須仍然是確定性的;在給定恆定輸入的情況下,無論執行多少次操作,輸出都是恆定的。沒有隨機成分。

    您可能會感到困惑的是哈希模擬的術語,它是 random oracle 。想像一個黑匣子,裡面是一個有攝影記憶的小矮人,還有一些產生完全隨機數的神秘方法。您在紙上寫下一些東西,然後將其推入供男人拿到的插槽中。他讀了一下,然後發生兩件事之一。要么他以前沒有讀過,在這種情況下,他將生成一個新的隨機數並將其提供給您,同時將您的消息和數字都提交給他。或者,他之前已經閱讀了此確切消息,在這種情況下,他會記住他第一次閱讀時生成的電話號碼並給您電話號碼。隨機數生成器將永遠不會生成它已經生成的數字,它具有無限可能的大小,並且小矮人的記憶是無限且可靠的。因此,這個小矮人永遠不會以為自己以前從未讀過一條消息,永遠不會忘記他之前曾經讀過一條消息,因此永遠不會為相同的消息產生兩個不同的數字,也不會為兩個不同的消息產生相同的數字消息。

    這是哈希函數嘗試模擬的內容。他們無法用照片記憶為這個小矮人建模,因為這將需要無限的存儲空間和無限的通用可用性,即使是沒有以任何其他方式連接到任何其他設備的設備也是如此。取而代之的是,它們依賴於確定性的但看起來是隨機的 計算,該計算將消息“消化”為哈希值。給定相同消息的相同哈希函數將產生相同的摘要。但是,這些函數在允許返回的哈希值數量上受到限制。這創造了所謂的哈希衝突的可能性;除了散列值之外,還有更多可能的消息,因此遲早(希望是以後),兩條不同的消息將產生相同的散列。

  3. 基於三個基本原因可以破解哈希。首先,由於它們是消息的確定性,數學推導,因此,數學家(因而是攻擊者)最終找到了一條消息與其哈希值之間,或者兩條消息與其產生的哈希值之間的數學關係。曾經隨機尋找的東西不再如此。根據發現的弱點的性質,這將允許進行多種攻擊;如果有給定消息及其散列的算法方法來生成衝突消息,那將是一個問題。如果有一種方法可以處理消息並預測生成的哈希,那就是另一個問題。如果實際上有一種反向散列的方法,則從散列中產生一條消息,該消息在重新散列時也會產生相同的散列,這就是一個嚴重問題。

    第二個,因為散列的摘要大小有限,遲早兩封郵件會產生相同的散列。這意味著攻擊者不必查找您用來生成特定哈希值的消息。他要做的就是找到產生相同哈希值的 消息。這種可能性很小,從理論上講,儘管存在許多可能的散列,但這種可能性很小,但仍然比無限遠的散列更好。

    最後,儘管有很多可能的消息,但可能消息的數量卻少得多。我們通常為哈希函數提供的消息通常具有某種結構(基於語言,主題,電子格式和用途),這意味著,給定消息的某些部分,我們可以更準確地猜測消息的其他部分。用信息科學的術語來說,這意味著轉換為散列的消息通常具有比散列函數本身更低的;簡而言之,產生256位摘要的哈希函數理論上可以產生這些位的任何排列2 ^ 256。但是,如果說只有10,000個可能的消息可以被正在研究攻擊的系統輸入到此哈希函數中,那麼在2 ^ 256個可能的哈希值中就只會看到10,000個,更重要的是,在最壞的情況下,攻擊者只需嘗試所有10,000種可能的輸入即可找到產生他所尋找的哈希值的輸入。

  4. ol>
這就是為什麼我喜歡IT安全性的堆棧交換站點。
您對#1的解釋也正是我所需要的。但是我確實有一個問題。看起來“哈希”就像是給定事物的數字版本(在這種情況下為密碼)。因此,如果我有一個網站,並且有10萬人註冊。然後50%的人使用密碼“ password”我是否能夠通過僅存儲“ password”的哈希值而不是密碼多次來節省大量空間?
好吧,如果您使用的是安全散列(> = 256位摘要大小),那麼存儲“ password”的散列值將增加您的存儲大小。此外,如果攻擊者曾經看到50%的用戶帳戶具有相同的密碼哈希,他會知道他所要做的就是破解一個密碼,並且他可以訪問50%的用戶帳戶。您應該“說”密碼哈希值;有多種方法,但是最終結果是,由於每個帳戶都有一個額外的唯一鹽值,因此由相同算法散列的相同密碼會產生不同的摘要。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...