簡體   English   中英

如何安全地存儲哈希?

[英]How do I securely store hashes?

當用戶想要重設密碼時,將使用唯一的URL發送電子郵件,以便他可以重設密碼。 像這樣:website.com/forgot.php?email'.$email.'&hash='.$thehash

$ thehash是數據庫中存儲的每個用戶的唯一哈希。

問題在於$ thehash就像在URL中一樣被存儲在數據庫中。 就像將密碼以純文本格式存儲一樣愚蠢。 如果有人可以訪問數據庫,那么我的密碼存儲在sha512和安全鹽中就沒關系了,攻擊者可以使用數據庫中所有的值(電子郵件和哈希)來訪問所有帳戶,並且更改用戶密碼。

當我對用戶密碼進行哈希處理時,用戶擁有一部分在數據庫中找不到的信息,即純文本密碼,因此可以解決。 但是現在,我不知道該怎么辦,因為我在數據庫中找不到任何唯一的東西。 那么什么是解決這個問題的好方法呢? 如何安全地存儲哈希?

問題不在於您如何存儲哈希,而在於重置鏈接的工作方式。

由於您提到的原因,您不想使用哈希來驗證密碼的用戶身份。

改用易腐爛的記號。 每當用戶請求重設密碼時,都將生成令牌(256位就足夠了),並將其哈希值,請求它的用戶以及令牌創建日期時間存儲在數據庫中。 將該令牌放在重置鏈接中(而不是電子郵件+哈希)。 當用戶單擊鏈接時,您的服務器將收到令牌,找到相應的用戶,並且可以安全地更改密碼。

通過僅將令牌的哈希存儲在數據庫中,而在電子郵件鏈接中使用未哈希的令牌,可以確保即使攻擊者仍然可以訪問您的數據庫,他也無法偽造自己的重置鏈接。

通過將用戶單擊鏈接的時間與生成令牌時存儲的日期時間進行比較,您將能夠控制重置鏈接的有效時間(並避免用戶忘記刪除電子郵件,獲取電子郵件的情況帳戶遭到入侵,並讓攻擊者使用重置鏈接)。

查看此Authlogic密碼重置教程以獲取完整的實現。

當用戶想要重置密碼時...

我將向您介紹OWASP忘記密碼備忘單 ,其本質上指出:

1收集身份數據或安全性問題

2驗證安全問題

以及為用戶提供哈希值的替代方法:

3通過側通道發送令牌:“在執行第2步之后,立即鎖定用戶帳戶。然后通過電子郵件或短信向用戶發送隨機生成的具有8個或更多字符的代碼。系統生成的隨機代碼僅具有有限的有效期,例如不超過20分鍾左右……當然,從某種意義上說,一旦重置用戶密碼,隨機生成的令牌就不再有效...”

  • 請允許我在此處添加,您可以通過電子郵件將原始令牌發送給用戶,但使用與普通密碼完全相同的保護(即PBKDF2 / BCrypt / SCrypt)將其哈希存儲在數據庫中,並僅將生成的哈希存儲在數據庫中。數據庫。 然后,當用戶使用密碼重設電子郵件時,如果它仍在很短的時間范圍內,請采取他們給您的任何東西,然后使用您的password_verify()函數將其與重設令牌哈希進行比較。

    4允許用戶更改密碼

因此,您的重置令牌受到以下保護:

  • 僅在經過驗證的請求下發出
  • 僅有效幾分鍾
    • 也就是說,希望對於那些竊取您的數據庫備份的人來說,時間太短而無法使用它們!
  • 您可以選擇通過密碼哈希機制來保護其免受惡意數據庫訪問的侵害,就像其他任何密碼一樣。

在令牌處於活動狀態時,重置令牌顯然不受訪問用戶電子郵件帳戶或可以更改列出的電子郵件帳戶的攻擊者的保護。

整個安全問題上的密碼重置顯然不受攻擊者的保護,因為攻擊者知道或可以破壞安全答案,並且可以訪問(或可以更改)用戶列出的電子郵件帳戶。

@relentless是正確的。 如果被攻擊者可以訪問數據庫,難道他/她將能夠重置密碼,而不管密碼是否具有密鑰? 您還假設他們已經獲得了對該用戶電子郵件帳戶的訪問權限,或者完全猜到了哈希值。 要考慮的另一件事,您不一定必須將哈希存儲在數據庫中。 考慮一下:假設哈希是通過將用戶的電子郵件與您先前確定的密鑰相結合而創建的。 加載重置頁面后,只需重新哈希電子郵件和密鑰,並查看其是否與查詢字符串中的哈希值匹配。

互聯網上有很多有關此問題的文章,但是我是這樣看的。

如果我在以下方面做錯了,請糾正我...

僅當您的實際數據庫和登錄憑據被已知/損壞並可以在其中更改數據時,黑客才能造成永久性破壞。 否則,即使更改URL中的電子郵件地址,數據也將保持安全。 只要您不給潛在的黑客提供更改電子郵件地址的后門, 那就是黃金。

如果使用單向不可逆的散列方法正確存儲了密碼,那么密碼就是這樣。 不可逆轉的機會非常大,無法將它們放在一起。 如果用戶的密碼被泄露,那么這將是一個紅旗為你重新思考你使用你的數據庫的方式。

充其量,即使更改了用戶密碼,也要給用戶提供一種再次更改密碼的方法,然后設置一列以跟蹤更改次數。 如果它經常改變得太頻繁,那將再次成為另一個危險信號 我使用了與您現在使用的方法類似的方法,即使更改URL中的電子郵件地址,數據庫中也沒有任何更改。 一切都必須匹配。

另外,即使有人確實更改了用戶密碼,但根據您授予用戶的權限或訪問類型,黑客將采取什么措施,再次更改密碼?

該URL應包含與該帳戶相關聯的電子郵件,存儲在數據庫中然后被檢索的哈希密鑰,並且僅在黑客掌握了用戶的電子郵件帳戶憑據並可以訪問唯一鏈接的情況下才起作用。

我不知道您目前正在使用哪種哈希方法,但是有許多建議使用。

其他連結:


腳注:

如果可以的話,引用owlstead :(我同意)

“最好的方法是PBKDF,例如PBKDF2,bcrypt和scrypt。如果可能的話,不應該使用crypt。password_hash password_hash()是crypt和bcrypt的實現,而不是單獨的算法。如果用戶密碼選擇了錯誤的密碼,則始終會受到威脅。 。不能消除密碼散列或PBKDF的一種方法,但是可以將它們強制強行使用(例如,使用字典攻擊)”

為什么不將$ thehash作為會話變量傳遞,然后將其檢查到定向到“是否已設置?”的函數,如果已設置,則執行,然后刪除會話變量。

如何安全地存儲哈希?

...

那么什么是解決這個問題的好方法呢? 如何安全地存儲哈希?

這是“無人值守的密鑰存儲”問題,它是沒有解決方案的問題。 請參閱Peter Gutmann 工程安全

OWASP的John Steven提供了與密碼哈希和存儲有關的更好的文章之一。 他帶您了解各種威脅,並解釋為什么以某種方式完成任務。 看到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM