日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

安全地创建和存储密码

發(fā)布時(shí)間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安全地创建和存储密码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

幾乎每次涉及用戶(hù)配置文件時(shí),都必須管理用戶(hù)憑據(jù),從而能夠創(chuàng)建和存儲(chǔ)用戶(hù)密碼。 通常應(yīng)該使用散列密碼和鹽分密碼來(lái)準(zhǔn)備數(shù)據(jù)庫(kù)公開(kāi)和通過(guò)使用Rainbow表進(jìn)行散列反轉(zhuǎn)的密碼。
但是,找到以明文形式存儲(chǔ)的密碼并不少見(jiàn)(很不幸)(我們將跳過(guò)一些必須努力學(xué)習(xí)正確操作方法的大公司名單)。 當(dāng)具有未加密,未哈希和未加鹽的密碼的數(shù)據(jù)庫(kù)泄漏時(shí),后果很明顯……..第二種最糟糕的方法是使用哈希但未加鹽的密碼。 在這種情況下彩虹表或哈希逆轉(zhuǎn)喜歡在網(wǎng)絡(luò)上的服務(wù)這個(gè)或這是巨大的幫助。 最后,第三種最糟糕的方法是僅依靠加密記錄-一旦密鑰或解密數(shù)據(jù)庫(kù)泄露,游戲就結(jié)束了!

那么怎么做對(duì)呢? 簡(jiǎn)單的答案是:將PBKDF2WithHmacSHA1與鹽值一起使用。 例如,可以在此處找到如何使用它的示例。 該實(shí)現(xiàn)看起來(lái)很成熟,但是很復(fù)雜。 如果您只是想了解鹽腌密碼的概念,則可能需要查看以下演示代碼:

public static final String HASH_ALGORITHM = "SHA-256"; public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");private static final char[] PASSWORD_CHARS = new char[]{'!', '@', '#', '$', '%', '&', '*', '(', ')', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; public String getRandomString(final int length) {/** Don't try to seed SecureRandom yourself unless you know * what you are doing! * @see Randomly failed! Weaknesses in Java Pseudo Random Number Generators (PRNGs).*/ SecureRandom secureRandom = new SecureRandom(); StringBuilder sb = new StringBuilder(length);int position = 0;// create a random string of the requested length from a set of allowed charsfor (int i = 0; i < length; i++ ) {position = secureRandom.nextInt(PASSWORD_CHARS.length);sb.append(PASSWORD_CHARS[position]);}return sb.toString();}public static byte[] createPasswordHash(final String password,final String salt) {byte[] result = null;try {MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);digest.update(salt.getBytes(DEFAULT_CHARSET));digest.update(password.getBytes(DEFAULT_CHARSET));result = digest.digest();} catch (NoSuchAlgorithmException e) {// TODO Logging}return result;}public static boolean checkPassword(final User user, final String password) {boolean result = false;String storedPasswordHash = user.getPwHash();String salt = user.getSalt();byte[] checkPasswordHashBytes = createPasswordHash(password, salt);String checkPasswordHash = encodeBase64(checkPasswordHashBytes); // for simplicity let's say we use Base64if (checkPasswordHash != null && storedPasswordHash != null&& checkPasswordHash.equals(storedPasswordHash)) {result = true;}return result;}

該代碼期望某種帶有pwHash和salt字段的用戶(hù)對(duì)象(這兩個(gè)字段都不敏感!)來(lái)存儲(chǔ)必要的信息。 可以安全地保留此User對(duì)象(以防萬(wàn)一沒(méi)有其他敏感數(shù)據(jù)鏈接到該對(duì)象)。 即使數(shù)據(jù)庫(kù)泄漏,攻擊者也必須蠻力地使用密碼和鹽的組合,或者為鹽腌的密碼計(jì)算出彩虹表。 請(qǐng)注意,該彩虹表不能與帶有不同鹽的相同密碼重復(fù)使用! 這意味著,使用隨機(jī)選擇的鹽,即使密碼保持不變,攻擊者也將需要彩虹表來(lái)反轉(zhuǎn)每種鹽的哈希函數(shù)。

上面的代碼保持盡可能簡(jiǎn)單。 例如,getRandomString可以重新用于創(chuàng)建鹽值,并可能在注冊(cè)過(guò)程中用于生成臨時(shí)密碼。 但是請(qǐng)記住,此代碼遠(yuǎn)非在生產(chǎn)環(huán)境中可用!

最后一些注意事項(xiàng):確保使用足夠長(zhǎng)的鹽,防止鹽重用,并使用強(qiáng)大的算法進(jìn)行哈希處理!

參考: Java安全和相關(guān)主題博客上的JCG合作伙伴 Christopher Meyer 安全地創(chuàng)建和存儲(chǔ)密碼 。

翻譯自: https://www.javacodegeeks.com/2013/08/safely-create-and-store-passwords.html

總結(jié)

以上是生活随笔為你收集整理的安全地创建和存储密码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。