MD5已確認實用的碰撞和SHA1達到碰撞的概率每天都在增長(可以通過分析經典生日問題來找到碰撞概率的更多信息),因此,如果我們需要應用哈希算法,我們應該使用散佈的算法,我們應該使用具有更大的輸出空間(以及可忽略不計的碰撞概率),例如SHA256,SHA512,漩渦等
>它們也稱為“偽隨機函數”,這意味著哈希功能的輸出應與真實的隨機數生成器(或trng)無法區分。
不能使用有效算法將哈希函數的輸出回到輸入的事實並不意味著不能破解它。 簡單的Google搜索通常在我們的範圍內包含包含通用單詞和短字符串的哈希的數據庫。另外,通過字典攻擊,常見的弦可以輕鬆,快速地刺激或破裂。
示例>
>此外,我們本來可以做到的最簡單的攻擊……只需抓住哈希雜誌和谷歌搜索……很可能存在在線數據庫中。哈希數據庫的示例是:
為什麼鹽的哈希是存儲密碼的不安全
f(密碼,鹽)=哈希(密碼鹽)
為了減輕蠻力攻擊,鹽應長達64個字符,但是,為了稍後對用戶進行身份驗證,必須將鹽存儲在數據庫內的純文本中,因此:
>由於每個用戶都會有完全不同的鹽,因此也可以避免簡單哈希的問題,我們可以輕鬆判斷2個或更多用戶是否使用相同的密碼;現在哈希將有所不同。我們也無法直接獲取密碼哈希並嘗試將其穀歌搜索。同樣,有了較長的鹽,蠻力攻擊是不可能的。但是,如果攻擊者可以通過SQL注入攻擊或直接訪問數據庫來訪問此鹽,則可能可能是蠻力或字典攻擊,尤其是當您的用戶使用常見密碼(再次,例如'123456')時:
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
>
>有一篇關於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>
為了破解通過拉伸保護的密碼,攻擊者應該:
應用加密技術怎麼樣? >散列和密碼(或加密 'pseudo-random置換式'>。這意味著將輸入消息切成薄片和更改,以使輸出與TRNG無法區分,但是可以將輸出再次轉換回原始輸入。這種轉換是使用加密密鑰進行的,沒有該密鑰,就不可能再次將輸出轉換為原始消息。
與哈希相比, >必須非常謹慎地在如何正確應用加密技術時,認為僅通過將加密算法應用於敏感數據就足以確保安全性是錯誤的,因為存在許多可能導致數據洩漏的問題。通常,您絕不應該考慮應用自己的加密實施
假設表的純文本內容如下: 現在,Adobe的某人決定密碼密碼,但犯了兩個大錯誤: 例如,假設在將加密算法應用於密碼字段之後,現在我們的數據看起來如下: >雖然密碼無法簡單地解密,並且通過檢查數據,我們可能會發現記錄2和7共享相同的密碼,以及3和6…,我們無法以簡單的方式知道使用的加密密鑰。這是密碼提示字段發揮作用的地方。 記錄6提示是“我是一個!”>沒有給我們太多信息,但是記錄3的提示確實如此……我們可以肯定地猜測密碼是“女王”。 記錄2和7個提示並不能單獨提供很多信息,但是如果我們一起看它們,那麼有多少個假期與可怕的電影相同?現在,我們可以訪問所有使用“萬聖節”作為密碼的每個人的帳戶。
f(鍵,primarykey)=鍵prientarkey
上面的我只是簡單地將加密密鑰和主密鑰的值加成,以生成最終的加密密鑰,但是您可以( 在將可調整加密應用於用戶表後,現在看起來如下: >當然我們仍然有密碼提示問題,但是現在每個記錄都有一個唯一的值,因此尚不明顯使用哪些用戶使用相同的密碼。 >我想強調的是,加密不是最好的解決方案,如果可能會注入很多弱點,應避免存儲密碼……您可以並且應該堅持使用已驗證的解決方案(例如BCRypt)來存儲密碼,但是請記住,即使是經過驗證的解決方案也有自己的弱點。
>密碼哈希 >密碼中的鹽如何增強安全性? >使用弱的哈希算法有什麼風險?像MD5和SHA-1一樣,也容易受到攻擊。它們具有已知的漏洞,並且可以通過現代計算能力相對輕鬆地破解。例如,它們容易受到碰撞攻擊的影響,其中兩個不同的輸入產生了相同的哈希輸出。這損害了數據的完整性。因此,建議使用更強大的哈希算法(如SHA-256或BCRYPT)提供更高級別的安全性。 >彩虹桌攻擊是一種黑客攻擊,其中攻擊者使用彩虹桌,這是一張用於逆轉加密哈希功能的預算表,以破解哈希密碼。彩虹表包含加密密碼的所有可能的明文排列。此方法可以有效地防止基本的哈希,但是在每個密碼上添加獨特的鹽可以防止彩虹桌攻擊。 >辣椒在密碼哈希中有什麼作用?添加了一秒鐘的秘密鹽,以提高存儲密碼的安全性。雖然通常將鹽存儲在Hashed密碼旁邊的數據庫中,但通常在應用程序代碼中保存胡椒粉並分別保存。這意味著,即使攻擊者可以在沒有胡椒的情況下獲得對數據庫的訪問權限,他們也無法破解密碼。 >哈希功能對我的應用程序性能有什麼影響?
您還可以使用標準算法,例如PBKDF2,它是基於密碼的鍵推導函數<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
<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>
>
考慮以下架構:
>沒有完美的解決方案,並且每天都有破壞我們的安全措施的風險。但是,密碼和數據安全研究和研究繼續進行,隨著海綿功能的相對定義,我們的工具包一直在增長。
密碼哈希和加密之間有什麼區別?
>密碼哈希和加密是使用兩個不同的方法來保護數據,但它們具有不同的目的。加密是一個雙向函數。可以用適當的鍵解密加密的內容。這意味著,如果有人獲得對加密密鑰的訪問,則可以解密數據。另一方面,哈希是一個單向函數,它會拼寫純文本以產生獨特的消息摘要。即使輸入的很小的變化也會產生如此急劇的變化,以至於新的哈希值不像舊的哈希值。這使得不可能從哈希值重新生成原始數據,從而使哈希儲存密碼更加安全。
>>密碼拉伸如何增加安全性?
密碼拉伸是一種用於增加的技術存儲密碼的安全性。這是通過將加密哈希函數以及鹽加上鹽應用於用戶密碼的,然後將結果重新限制多次來完成。此過程增加了哈希密碼所需的時間,這可以阻止依靠許多快速嘗試猜測密碼的攻擊者。
>什麼是彩虹桌攻擊?
>為什麼將哈希算法秘密保留很重要?保持散列算法的秘密,並非總是可能的,尤其是使用廣泛使用的算法。良好的哈希系統的安全不依賴於該算法的保密性;取而代之的是,它取決於添加到哈希的鹽的保密性和隨機性。即使攻擊者知道算法,如果沒有鹽,他們也無法從哈希(Hash)中逆轉密碼。
>我應該多久更新或更改散列算法?或更改哈希算法取決於幾個因素,包括您要保護的數據的敏感性和當前技術狀態。根據經驗,如果更安全的哈希算法被廣泛接受,或者在當前算法中發現漏洞,則該更新了。請始終了解密碼學的最新發展,以確保最大的安全性。
以上是密碼哈希的風險和挑戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!