假設我們不使用password_hash
,而是使用crypt()
而不是sha512
來代替散列密碼。我們需要向密碼添加salt,因此攻擊者不能使用彩虹表攻擊。爲什麼鹽必須是良好和很多隨機答案中所述的很多答案?即使鹽相差一點或者不是很隨意,它仍然會給別人一個完全不同的散列。因此,攻擊者不會知道誰使用相同的密碼,他仍然無法創建一個彩虹表。爲什麼要吃好鹽?
Q
爲什麼要吃好鹽?
4
A
回答
2
計算和儲存強鹽需要很少的努力,但降低了彩虹表預先計算的鹽的天然小的機會。
如果鹽是3位數字,攻擊者可能會爲所有可能的鹽組合預先計算彩虹表是可行的。如果salt是一個隨機的24個字符的字母數字字符串,那麼攻擊者可以預先計算所有可能的鹽的機率幾乎爲零。
2
鹽應該是獨特的,必須足夠長,並且應該是不可預測的。隨機性不是必需的,但它是計算機滿足這些要求的最簡單方法。鹽不是祕密的目的,即使知道鹽也會達到它的目的。
唯一性意味着它不僅在數據庫中是唯一的(否則您可以使用用戶標識),它應該是全球唯一的。有人可以爲例如例如1-1000,並能夠檢索具有這些用戶標識的所有帳戶的密碼(通常管理帳戶的用戶標識低)。
足夠長:如果鹽太短(可能的組合太少),再次建立彩虹桌會變得有利可圖。鹽和密碼一起可以被看作只是一個更長的密碼,如果你可以爲這個更長的密碼建立一個彩虹表,你也可以得到較短的原始密碼。對於非常強大和長時間的密碼,醃製實際上根本不是必需的,但大多數人爲生成的密碼可能是蠻橫的,因爲它們很短(人們必須記住它們)。
也使用從其他參數衍生的鹽可以歸入此類別。僅僅是因爲你從用戶ID計算散列,這不會增加可能的組合。
不可預測性是有點不那麼重要,但試想一次您使用的用戶ID爲鹽的情況下,攻擊者可以找出未來幾年用戶ID是什麼,因此可以預先計算rainbow-的窄數表。根據所使用的散列算法,這可以適用或不適用。他有時間優勢,可以立即取回密碼。如果管理員帳戶使用可預測的鹽,則會出現更多問題。
因此,使用真正的隨機數,從OS隨機源(dev/urandom)生成,是最好的,你可以做的。即使你忽略了上面的所有原因,爲什麼當有更好的方法時使用衍生鹽,爲什麼不使用你知道的最好方法?
相關問題
- 1. 爲什麼密碼鹽被稱爲「鹽」?
- 2. 鹽爲什麼要和散列值的長度相同?
- 3. 爲什麼鹽archive.extracted命令創建
- 4. 爲什麼鹽會阻止彩虹桌?
- 5. 爲什麼鹹菜吃內存?
- 6. 爲什麼Oracle吃我的字符串?
- 7. RDC爲什麼吃我的擊鍵?
- 8. 鹽有什麼關係?
- 9. 爲什麼要使用websocket,使用它有什麼好處?
- 10. 我們爲什麼需要,使用貓鼬有什麼好處
- 11. 爲什麼我需要Symfony formbuilder?有什麼好處?
- 12. 爲什麼Sass好?
- 13. 爲什麼LuaJIT這麼好?
- 14. 爲什麼要爲
- 15. 使用Scapy發送tcp負載:爲什麼要吃一個字節?
- 16. 爲什麼UIWebView吃這麼多的內存?
- 17. 這個erlang代碼爲什麼會吃這麼多的內存?
- 18. 是內存泄漏?爲什麼java.lang.ref.Finalizer吃了這麼多內存
- 19. 這是好嗎?鹽醃
- 20. Sticky Div需要吃
- 21. 什麼意思爲什麼「寫得好」?
- 22. 什麼是第一個,鹽或哈希?
- 23. 存儲密碼鹽有什麼意義?
- 24. Bcrypt,鹽和成本是什麼意思?
- 25. 我誤解了哈希鹽是什麼?
- 26. 爲什麼globals不好?
- 27. 爲什麼這不好?
- 28. 爲什麼performSelector:onThread:不好?
- 29. 爲什麼require_once不好用?
- 30. 哪個更好?爲什麼?
好鹽和隨機鹽應該是不可能「猜測」鹽的。 – Rufinus
「好」我假設你的意思是「隨機」,在這種情況下,你應該閱讀[這個答案](http://stackoverflow.com/a/1645190/139010),特別是「所以,爲什麼鹽必須是隨機?」 –
@Rufinus如果他得到密碼,他會得到鹽。 –