安全密码存储–请勿做的事和Java示例
生活随笔
收集整理的這篇文章主要介紹了
安全密码存储–请勿做的事和Java示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
安全存儲密碼的重要性 作為軟件開發人員,我們最重要的職責之一就是保護用戶的個人信息。 沒有我們應用程序的技術知識,用戶別無選擇,只能相信我們正在履行這一責任。 令人遺憾的是,在密碼方面,軟件開發社區的記錄不一。 雖然不可能建立一個100%安全的系統,但幸運的是,我們可以采取一些簡單的步驟來使用戶密碼足夠安全,以使潛在的黑客能夠尋找更容易的獵物。 如果您不希望所有背景知識,請隨時跳到下面的Java SE示例 。 不要 首先,讓我們快速討論一些在構建需要身份驗證的應用程序時不應該做的事情: 添加新用戶時,請調用generateSalt() ,然后調用getEncryptedPassword() ,并存儲加密的密碼和鹽。 不要存儲明文密碼。 不必擔心將鹽與加密的密碼保存在單獨的表或位置中; 如上所述,該鹽是非秘密的。 對用戶進行身份驗證時,請從數據庫中檢索以前加密的密碼和鹽,然后將它們和他們輸入的明文密碼發送到authenticate() 。 如果返回true,則認證成功。 當用戶更改密碼時,可以安全地重用他們的舊鹽。 您可以只用舊的鹽調用getEncryptedPassword() 。 很容易,對吧? 如果您要構建或維護違反上述任何“禁止”行為的應用程序,那么請您的用戶幫忙,并使用PBKDF2或bcrypt之類的東西。 幫助他們,Obi-Wan開發人員,您是他們唯一的希望。 參考: 安全密碼存儲– Java博客上的Jerry,我們的JCG合作伙伴 Jerry Orr提供了許多不要做的事情,一些需要做的事情以及一個具體的Java SE示例 。
- 除非確實需要,否則不要存儲身份驗證數據。 這似乎是一個解決方案,但是在開始構建用戶憑據數據庫之前,請考慮讓其他人來處理它。 如果您要構建公共應用程序,請考慮使用OAuth提供程序,例如Google或Facebook 。 如果要構建內部企業應用程序,請考慮使用任何可能已經存在的內部身份驗證服務,例如公司LDAP或Kerberos服務。 無論是公共應用程序還是內部應用程序,您的用戶都將無需記住其他用戶ID和密碼,這將是不勝枚舉的選擇,而且數據庫供黑客攻擊的數據庫少了一個。
- 如果您必須存儲身份驗證數據,出于戈斯林的考慮,請不要以明文形式存儲密碼 。 這應該很明顯,但是值得一提。 讓我們至少讓黑客大汗淋漓。
- 除非您確實需要檢索明文密碼,否則不要使用雙向加密。 僅當您使用他們的憑據代表他們與外部系統交互時,才需要知道他們的明文密碼。 即使這樣,最好還是讓用戶直接通過該系統進行身份驗證。 為了清楚起見, 您無需使用用戶的原始明文密碼在應用程序中執行身份驗證 。 稍后我將對此進行更詳細的介紹,但是在執行身份驗證時,您將對用戶輸入的密碼應用加密算法,并將其與您存儲的加密密碼進行比較。
- 不要使用像MD5這樣的過時的哈希算法 。 老實說,用MD5散列密碼實際上是沒有用的。 這是MD5哈希密碼: 569a70c2ccd0ac41c9d1637afe8cd932 。 轉到http://www.md5hacker.com/ ,您可以在幾秒鐘內將其解密。
- 不要提出自己的加密方案。 世界上有少數出色的加密專家,能夠勝過黑客并設計出新的加密算法。 我不是其中之一,很可能您也不是。 如果黑客可以訪問您的用戶數據庫,那么他們也可能也可以獲取您的代碼。 除非您發明了PBKDF2或bcrypt的下一個偉大的后繼產品,否則它們將瘋狂地破解,因為它們會Swift破解所有用戶的密碼并將其發布在Darknet上 。
- 選擇一種單向加密算法。 如前所述,一旦您加密并存儲了用戶密碼,就無需再知道真實的價值了。 用戶嘗試進行身份驗證時,只需將相同的算法應用于他們輸入的密碼,然后將其與您存儲的加密密碼進行比較。
- 使加密速度盡可能慢,以使應用程序可以容忍 。 任何現代的密碼加密算法都應允許您提供增加密碼加密所需時間的參數(例如,在PBKDF2中,指定迭代次數)。 為什么慢的好? 您的用戶不會注意到是否需要花費100毫秒以上的時間來加密密碼,但是嘗試進行暴力攻擊的黑客會在運行數十億次算法時注意到差異。
- 選擇一個眾所周知的算法 。 美國國家標準技術研究院(NIST) 建議使用PBKDF2作為密碼。 bcrypt是一種流行且已建立的替代方法,而scrypt是一種相對較新的算法,已廣受歡迎。 所有這些之所以受歡迎是有原因的:它們很好。
- 由NIST推薦。 特殊出版物800-132的 5.3節建議使用PBKDF2加密密碼。 安全官員會喜歡的。
- 可調式按鍵伸展功能可以克服蠻力攻擊 。 密鑰擴展的基本思想是,在將哈希算法應用于密碼之后,您將繼續對結果多次應用同一算法(迭代計數)。 如果黑客試圖破解您的密碼,那么這將大大增加嘗試數十億種可能的密碼所花費的時間。 如前所述,速度越慢越好。 PBKDF2允許您指定要應用的迭代次數,從而使其盡可能慢。
- 必需的鹽才能打消彩虹桌子的攻擊并防止與其他用戶的碰撞。 鹽是每個用戶唯一的隨機生成的位序列,并作為哈希的一部分添加到用戶密碼中。 通過使預先計算的結果列表不可行,可以防止彩虹表攻擊 。 而且,由于每個用戶都有自己的鹽,即使兩個用戶使用相同的密碼,加密值也將不同。 關于是否應將鹽與加密密碼分開存儲的地方,存在很多相互矛盾的信息。 由于PBKDF2中的密鑰擴展已經保護了我們免受暴力攻擊,因此我認為沒有必要隱藏鹽。 NIST SP 800-132的3.1節還將鹽定義為“非秘密的二進制值”,這就是我所要遵循的。
- Java SE 6的一部分 。 無需其他庫。 這對于在具有限制性開放源代碼策略的環境中工作的人員特別有吸引力。
翻譯自: https://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html
總結
以上是生活随笔為你收集整理的安全密码存储–请勿做的事和Java示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晋绥怎么读 晋绥的读音
- 下一篇: 具有LCS方法的通用文本比较工具