我需要加密密码才能插入到数据库中。同样,当我需要该密码时,我需要解密此值。这样做的简单方法是什么?
注意:此操作不是很安全。
请不要实施您当前的计划,而应该使用MessageDigest来完成此任务。对用户密码(例如SHA-256,SHA-384和SHA-512 [还有其他]中的一种)应用单向加密哈希函数和SALT,以防止基于彩虹表的攻击。最后,对于密码重置,只需替换当前的密码哈希即可。
举个例子,
// We need a bytesToHex method first. So, from - // http://stackoverflow.com/a/9855338/2970947 final protected static char[] hexArray = "0123456789ABCDEF" .toCharArray(); public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; int v; for (int j = 0; j < bytes.length; j++) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } // Change this to something else. private static String SALT = "123456"; // A password hashing method. public static String hashPassword(String in) { try { MessageDigest md = MessageDigest .getInstance("SHA-256"); md.update(SALT.getBytes()); // <-- Prepend SALT. md.update(in.getBytes()); // md.update(SALT.getBytes()); // <-- Or, append SALT. byte[] out = md.digest(); return bytesToHex(out); // <-- Return the Hex Hash. } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } public static void main(String[] args) { System.out.println(hashPassword("Hello")); System.out.println(hashPassword("Hello")); System.out.println(hashPassword("Hello1")); System.out.println(hashPassword("Hello2")); }
哪个应该输出
60C1E22D18D022F01EEF0CAF999E52FD44C0C8EFD2161E9F4D24120AB0AFC84D 60C1E22D18D022F01EEF0CAF999E52FD44C0C8EFD2161E9F4D24120AB0AFC84D CAAC2288692DD57BADFAE0225A42E59E1979E0116D009EEF01912E8C75529515 E0A3963BFAF209A17422918CB1FC950A62858993CA9A7BA6F760B8D4688306FD
演示一个字符产生的哈希值有多大差异。