首頁 > 後端開發 > php教程 > 密碼哈希的風險和挑戰

密碼哈希的風險和挑戰

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-22 08:36:11
原創
798 人瀏覽過

密碼哈希的風險和挑戰

鑰匙要點

  • 散列是一個單向函數,可將可變長度數據映射到固定長度輸出,但由於已知的漏洞和碰撞的可行性,MD5和SHA-1(例如MD5和SHA-1)(如MD5和SHA-1)等簡單的哈希算法很容易受到攻擊。 >>>>>>>>>>>>>>。
  • 醃製密碼在哈希之前為每個密碼增加了一個獨特的價值,通過防止攻擊(例如彩虹桌和蠻力)來增強安全性,但必須安全地存儲鹽以防止剝削。
  • >
  • 密碼拉伸通過迭代多次劃定密碼來提高安全性,該密碼延遲了破解的嘗試,使蠻力攻擊更加耗時且不可行。
  • >使用強大的現代哈希算法(例如SHA-256或BCRYPT),以及實施諸如鹽和伸展等技術,對於增強密碼安全至關重要。
  • 儘管哈希技術的增強功能,但由於計算能力和技術的進步潛力,沒有任何方法完全是萬無一失的,因此強調了對密碼存儲策略進行連續更新和評估的需求。
  • >
  • 在過去的文章中,討論了密碼哈希作為將用戶憑據安全存儲在應用程序中的一種方式。 安全始終是一個非常有爭議的話題,非常相似的政治和宗教,在這裡,存在許多觀點,對於某人來說,“完美的解決方案”對他人不一樣。 我認為,違反應用程序的安全措施只是時間問題。隨著計算機功率和復雜性每天增加,今天的安全應用程序將不會那麼安全。 對於不熟悉Hash算法的讀者而言,它無非是一種單程函數,將可變長度的數據映射到固定長度的數據。 因此,如果我們分析上述定義,我們需要了解此類算法的以下要求和特徵:>
  • 一種方式函數:無法使用有效的算法逆轉輸出。 >
可變長度的數據映射到固定長度的數據:這意味著輸入消息空間可以是“無限”,但輸出空間不是。 這意味著2個或多個輸入消息可以具有相同的哈希。輸出空間越小,兩個輸入消息之間“碰撞”的概率越大。

MD5已確認實用的碰撞和SHA1達到碰撞的概率每天都在增長(可以通過分析經典生日問題來找到碰撞概率的更多信息),因此,如果我們需要應用哈希算法,我們應該使用散佈的算法,我們應該使用具有更大的輸出空間(以及可忽略不計的碰撞概率),例如SHA256,SHA512,漩渦等

>它們也稱為“偽隨機函數”,這意味著哈希功能的輸出應與真實的隨機數生成器(或trng)無法區分。

為什麼簡單的哈希是存儲密碼的不安全

不能使用有效算法將哈希函數的輸出回到輸入的事實並不意味著不能破解它。 簡單的Google搜索通常在我們的範圍內包含包含通用單詞和短字符串的哈希的數據庫。另外,通過字典攻擊,常見的弦可以輕鬆,快速地刺激或破裂。

示例

這是一個快速視頻,介紹了SQLMAP之類的工具如何通過在數據庫中刺激MD5哈希來通過SQL注入來破解密碼。

>

>此外,我們本來可以做到的最簡單的攻擊……只需抓住哈希雜誌和谷歌搜索……很可能存在在線數據庫中。哈希數據庫的示例是:

    http://www.hash-database.net/
  • https://isc.sans.edu/tools/hashsearch.html
  • http://md5online.net/
  • https://crackstation.net/
>我們還必須考慮到,由於2個或更多相同的密碼確實具有相同的哈希值,因此破解一個哈希會自動為您提供每個使用相同用戶的密碼。 只是要明確,說您有成千上萬的用戶,很可能會使用大量的使用(如果沒有執行密碼策略)臭名昭著的“ 123456”密碼。 該密碼的MD5哈希值是“ E10ADC3949BA59ABBE56E057F20F883E',因此,當您破解此哈希(如果您必須這樣做)並蒐索所有在其密碼字段中具有此值的用戶時,您會知道他們每個人都使用的每個用戶都使用'123456'密碼。

為什麼鹽的哈希是存儲密碼的不安全

為了減輕這種攻擊,鹽變得很普遍,但顯然不足以使當今的計算能力不足,尤其是在鹽弦短的情況下,這使得它可以野蠻。

基本密碼/鹽功能定義為:

f(密碼,鹽)=哈希(密碼鹽)

為了減輕蠻力攻擊,鹽應長達64個字符,但是,為了稍後對用戶進行身份驗證,必須將鹽存儲在數據庫內的純文本中,因此:

>由於每個用戶都會有完全不同的鹽,因此也可以避免簡單哈希的問題,我們可以輕鬆判斷2個或更多用戶是否使用相同的密碼;現在哈希將有所不同。我們也無法直接獲取密碼哈希並嘗試將其穀歌搜索。同樣,有了較長的鹽,蠻力攻擊是不可能的。但是,如果攻擊者可以通過SQL注入攻擊或直接訪問數據庫來訪問此鹽,則可能可能是蠻力或字典攻擊,尤其是當您的用戶使用常見密碼(再次,例如'123456')時:

<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登入後複製
登入後複製
登入後複製
>但是,即使一個密碼被破解,也不會自動為您使用它的每個用戶提供密碼,因為任何用戶都不應具有相同的存儲hash。

隨機性問題

為了生成良好的鹽,我們應該有一個良好的隨機數生成器。 如果php的rand()函數自動在您的腦海中彈出,請立即忘記它。

>

>有一篇關於Random.org中隨機性的出色文章。 簡而言之,計算機本身無法對隨機數據進行思考。據說計算機是確定性的機器,這意味著計算機能夠運行的每種算法都可以在完全相同的輸入中運行,始終會產生相同的輸出。

>當將隨機數要求到計算機時,通常會從多個來源獲取輸入,例如環境變量(日期,時間,字節,讀取/書面讀取,正常運行時間…),然後在它們上應用一些計算以產生隨機

數據。 這就是為什麼由算法給出的隨機數據稱為偽隨機的原因,因此與真實的隨機數據源區分開很重要。 如果我們能夠在執行偽隨機數生成器(或PRNG)時重新創建存在的確切條件,則我們將自動具有原始生成的數字。 此外,如果未正確實現PRNG,則可以在生成的數據中發現模式。 如果存在模式,我們可以預測結果…以此處記錄的窗口上的php rand()函數的情況。 雖然尚不清楚使用了哪個PHP或Windows版本,但您可以立即通過使用RAND()生成的位圖來確定出現問題,

與來自TRNG的輸出圖像進行比較:

密碼哈希的風險和挑戰

即使該問題已在php> = 5上解決,rand()甚至MT_RAND()仍然被認為是出於安全相關目的而被認為是高度不足的。

> 密碼哈希的風險和挑戰如果您需要生成隨機數據,請使用openssl_random_pseudo_bytes()在php 5> = 5.3.0起可用的,它甚至具有Crypto_strong標誌,它將告訴您字節是否足夠安全。

這是一個快速的代碼示例,可以使用openssl_random_pseudo_bytes()

生成隨機字符串

密碼伸展可能會有效,如果正確完成

>為了進一步減輕蠻力攻擊,我們可以實施密碼拉伸技術。 這只是一種迭代或遞歸算法,它本身可以一遍又一遍地計算哈希值,通常數万次(或更多)。
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登入後複製
登入後複製
登入後複製

該算法應足夠迭代以在至少1秒內執行所有計算(較慢的哈希也意味著攻擊者必須等待)。

為了破解通過拉伸保護的密碼,攻擊者應該:>

  1. 知道確切的迭代計數,任何偏差都會產生完全不同的哈希。
  2. 每次嘗試之間應至少等待1秒鐘。
  3. 這使攻擊不可能……但並非不可能。為了克服1秒的延遲,攻擊者的硬件規格應比對算法進行調整的計算機的高硬件規格更高,這可能意味著高成本,因此攻擊變得非常昂貴。
您還可以使用標準算法,例如PBKDF2,它是基於密碼的鍵推導函數>

也有時間和記憶密集型算法(例如bcrypt)

$ $成本是工作因素,而$鹽是您可以使用Secure_rand()函數生成的隨機字符串。
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登入後複製
登入後複製
登入後複製
工作負載因子完全取決於目標系統。您可以從“ 09”開始,然後將其增加,直到操作完成約為。 1秒。

>從php 5> = 5.5.0起
<span>Generate some string or get entry from dictionary
</span><span>Concatenate with salt
</span><span>Apply hash algorithm
</span><span>If generated hash == hash in database then Bingo
</span><span>else continue iterating</span>
登入後複製
> PHP中還沒有SCRYPT支持,但是您可以查看Domblack的Scrypt實現。

應用加密技術怎麼樣?

>散列和密碼(或加密

)是通常會感到困惑的術語。正如我之前提到的,哈希是一種偽隨機函數,而密碼通常為

'pseudo-random置換式'>。這意味著將輸入消息切成薄片和更改,以使輸出與TRNG無法區分,但是可以將輸出再次轉換回原始輸入。這種轉換是使用加密密鑰進行的,沒有該密鑰,就不可能再次將輸出轉換為原始消息。 與哈希相比,還有另一個很大的差異。雖然哈希的輸出消息空間是有限的,但密封輸出消息空間是無限的,因為輸入和輸出之間的關係為1:1,因此不存在碰撞。

>必須非常謹慎地在如何正確應用加密技術時,認為僅通過將加密算法應用於敏感數據就足以確保安全性是錯誤的,因為存在許多可能導致數據洩漏的問題。通常,您絕不應該考慮應用自己的加密實施

最近,Adobe對用戶數據庫有大量數據洩漏,因為它們不正確地應用了加密技術,我將以它們為例。 我會盡量直截了當,使事情變得非常簡單。

>

考慮以下架構:

假設表的純文本內容如下:>

現在,Adobe的某人決定密碼密碼,但犯了兩個大錯誤:

  1. 使用相同的密碼來加密密碼
  2. 決定將密碼提示字段留在純文本

例如,假設在將加密算法應用於密碼字段之後,現在我們的數據看起來如下:

密碼哈希的風險和挑戰

>雖然密碼無法簡單地解密,並且通過檢查數據,我們可能會發現記錄2和7共享相同的密碼,以及3和6…,我們無法以簡單的方式知道使用的加密密鑰。這是密碼提示字段發揮作用的地方。

>

記錄6提示是“我是一個!”>沒有給我們太多信息,但是記錄3的提示確實如此……我們可以肯定地猜測密碼是“女王”。 記錄2和7個提示並不能單獨提供很多信息,但是如果我們一起看它們,那麼有多少個假期與可怕的電影相同?現在,我們可以訪問所有使用“萬聖節”作為密碼的每個人的帳戶。

> 為了減輕數據洩漏的風險,最好切換到哈希技術,但是,如果您必須使用加密技術來存儲密碼,我們可以使用可調整的加密。這個術語看起來很花哨,但是很簡單。

>假設我們有成千上萬的用戶,我們想加密所有密碼。 如我們所見,我們不能為每個密碼使用相同的加密密鑰,因為數據將處於風險狀態(並且其他復雜的攻擊將成為可能)。 但是,我們不能為每個用戶使用一個唯一的密鑰,因為存儲這些密鑰本身將成為安全風險。 我們要做的是生成一個鍵,並使用每個用戶唯一的'tweak'>'tweak'>,並且鍵和調整都將是每個記錄的加密密鑰。可用的最簡單的調整是主要鍵,從定義上講,該鍵是表中的每個記錄所獨有的(儘管我不建議使用它,但這僅僅是為了演示概念):>

f(鍵,primarykey)=鍵prientarkey 上面的我只是簡單地將加密密鑰和主密鑰的值加成,以生成最終的加密密鑰,但是您可以(

和應該)應用哈希算法或密鑰推導函數。另外,您可能需要生成一個nonce(類似於鹽),而不是將主鍵用作調整,以使每個記錄用作調整。

在將可調整加密應用於用戶表後,現在看起來如下:>

>當然我們仍然有密碼提示問題,但是現在每個記錄都有一個唯一的值,因此尚不明顯使用哪些用戶使用相同的密碼。

>我想強調的是,加密不是最好的解決方案,如果可能會注入很多弱點,應避免存儲密碼……您可以並且應該堅持使用已驗證的解決方案(例如BCRypt)來存儲密碼,但是請記住,即使是經過驗證的解決方案也有自己的弱點。

結論

>沒有完美的解決方案,並且每天都有破壞我們的安全措施的風險。但是,密碼和數據安全研究和研究繼續進行,隨著海綿功能的相對定義,我們的工具包一直在增長。

>密碼哈希

上的常見問題(常見問題解答)

密碼哈希和加密之間有什麼區別?

>密碼哈希和加密是使用兩個不同的方法來保護數據,但它們具有不同的目的。加密是一個雙向函數。可以用適當的鍵解密加密的內容。這意味著,如果有人獲得對加密密鑰的訪問,則可以解密數據。另一方面,哈希是一個單向函數,它會拼寫純文本以產生獨特的消息摘要。即使輸入的很小的變化也會產生如此急劇的變化,以至於新的哈希值不像舊的哈希值。這使得不可能從哈希值重新生成原始數據,從而使哈希儲存密碼更加安全。

>

>密碼中的鹽如何增強安全性?

>

鹽是一個隨機數據,用作單向函數的附加輸入,該功能可以使用數據,密碼或密碼。鹽用於保護存儲中的密碼。鹽的主要功能是防禦字典攻擊或預先計算的彩虹桌攻擊。通過添加唯一的鹽,即使兩個用戶具有相同的密碼,哈希也將成為每個用戶的獨特之處。這意味著,即使黑客可以訪問哈希值,他們也無法在沒有唯一鹽的情況下破解密碼。

>使用弱的哈希算法有什麼風險?像MD5和SHA-1一樣,也容易受到攻擊。它們具有已知的漏洞,並且可以通過現代計算能力相對輕鬆地破解。例如,它們容易受到碰撞攻擊的影響,其中兩個不同的輸入產生了相同的哈希輸出。這損害了數據的完整性。因此,建議使用更強大的哈希算法(如SHA-256或BCRYPT)提供更高級別的安全性。

>

>密碼拉伸如何增加安全性?

密碼拉伸是一種用於增加的技術存儲密碼的安全性。這是通過將加密哈希函數以及鹽加上鹽應用於用戶密碼的,然後將結果重新限制多次來完成。此過程增加了哈希密碼所需的時間,這可以阻止依靠許多快速嘗試猜測密碼的攻擊者。

>

什麼是彩虹桌攻擊?

>彩虹桌攻擊是一種黑客攻擊,其中攻擊者使用彩虹桌,這是一張用於逆轉加密哈希功能的預算表,以破解哈希密碼。彩虹表包含加密密碼的所有可能的明文排列。此方法可以有效地防止基本的哈希,但是在每個密碼上添加獨特的鹽可以防止彩虹桌攻擊。

>為什麼將哈希算法秘密保留很重要?保持散列算法的秘密,並非總是可能的,尤其是使用廣泛使用的算法。良好的哈希系統的安全不依賴於該算法的保密性;取而代之的是,它取決於添加到哈希的鹽的保密性和隨機性。即使攻擊者知道算法,如果沒有鹽,他們也無法從哈希(Hash)中逆轉密碼。

>

>辣椒在密碼哈希中有什麼作用?添加了一秒鐘的秘密鹽,以提高存儲密碼的安全性。雖然通常將鹽存儲在Hashed密碼旁邊的數據庫中,但通常在應用程序代碼中保存胡椒粉並分別保存。這意味著,即使攻擊者可以在沒有胡椒的情況下獲得對數據庫的訪問權限,他們也無法破解密碼。

>

我應該多久更新或更改散列算法?或更改哈希算法取決於幾個因素,包括您要保護的數據的敏感性和當前技術狀態。根據經驗,如果更安全的哈希算法被廣泛接受,或者在當前算法中發現漏洞,則該更新了。請始終了解密碼學的最新發展,以確保最大的安全性。

>哈希功能對我的應用程序性能有什麼影響?

hash功能,尤其是安全的功能,可以是計算上的密集,可能會影響您的應用程序的性能。但是,與安全福利相比,這種影響通常可以忽略不計。由安全的哈希功能造成的延遲實際上可以作為對攻擊者的威懾作用,因為它減慢了猜測密碼的嘗試。

>我如何確保用戶密碼的最大安全性?為確保用戶密碼的最大安全性,請遵循以下最佳實踐:使用強,安全和最新的哈希算法;在每個密碼哈希中添加獨特的鹽;考慮添加胡椒粉;並實現密碼拉伸。此外,為您的用戶執行強密碼策略,例如最小長度以及字符,數字和符號的混合

以上是密碼哈希的風險和挑戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板