[英]Encrypting Emails, Hashing Passwords, and Storing them in DB?
首先,我對加密和散列的理解:
在構建Web應用程序時,我應該:
如果以上2點是正確的,我應該在哪里存儲加密密鑰和鹽?
如果我將它存儲在數據庫中,那么DB應該被破壞似乎有點無意義。 但是,好處是我可以為每個用戶分配唯一的加密密鑰和鹽。
我應該在應用程序的配置中存儲加密密鑰和salt嗎? 如果數據庫遭到破壞,至少加密密鑰和鹽也不會受到損害(希望如此)。 這個問題是它可能意味着每個人都共享相同的加密密鑰和鹽。
關於該怎么辦的建議?
如果您根本加密電子郵件,則需要使用公共salt /密鑰。 否則,您將如何通過數據庫中的電子郵件地址選擇用戶以檢查散列密碼是否正確? 您不能每次都解密每個電子郵件地址。
總的來說,我認為加密電子郵件地址幾乎沒有什么好處。 如果需要,請使用MySQL數據庫加密,但不要在應用程序級別擔心這一點。
用於散列密碼的salt應該/需要是唯一的並且可以存儲在數據庫中,實際上它可以是散列本身的一部分。 請參閱http://www.openwall.com/phpass/以獲得良好的實施。
你的理解對我來說似乎是對的。
密碼 :只應存儲密碼的哈希值以及用戶特定的鹽。 鹽可以是明文存儲的,鹽的原因是,攻擊者不能為所有用戶使用一個單一的彩虹表(構建彩虹表是昂貴的)。 建議使用hash_hmac()
函數。
電子郵件 :我認為加密這些地址是個好主意,但無論如何,如果攻擊者控制了服務器,他將能夠恢復這些地址。 我會將一個密鑰放在一個單獨的目錄中,該目錄位於Web根目錄之外(無法直接從Web訪問)。 不要在沒有解釋的情況下將其寫入文件中,擴展名* .php優於* .inc。 如果您無法訪問此類目錄,請至少創建一個並使用.htaccess Deny from all
保護它。
如果你需要在數據庫中找到一個電子郵件地址,你可以另外存儲一個哈希,這允許搜索不區分大小寫(首先轉到小寫,然后生成哈希)。
鹽應該是每個用戶,並且可以確實在數據庫中; 因此,鹽的一點是,擁有數據庫副本的人不能同時破解所有密碼,但每個密碼都是單獨的。
至於加密密鑰,這是一個更難的問題 - 絕對不會將其存儲在數據庫中; 如果您的平台提供任何類型的受保護存儲,您可能希望使用它。 請參閱此示例以獲得有用的答案: 在MySQL中使用/存儲加密密鑰的最佳方法是什么
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.