JSP简单密码加密解密

4

我需要将密码加密后插入数据库,当我需要使用该密码时,需要解密该值。有什么简单的方法可以做到这一点吗?

注意:这个操作不需要非常安全。

2个回答

12
请不要执行您当前的计划,而应该使用MessageDigest来完成此操作。 对用户密码应用单向加密哈希函数(例如SHA-256、SHA-384和SHA-512之一[还有其他方法]),并使用SALT来防止彩虹表攻击。最后,对于密码重置,只需替换当前密码哈希值。
例如,
// We need a bytesToHex method first. So, from -
// https://dev59.com/NGkw5IYBdhLWcg3wx9eC#9855338
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
展示一个字符对哈希结果有多么大的影响。

1
应该不是“只需替换当前的密码哈希值”吧? - MGorgon
@Ellios非常感谢。我该如何解密这个哈希值? - mekafe
4
你不需要这样做,这就是整个问题的关键。用户是唯一能提供他们“正确”密码的人。即使有人获取了你的密码数据库的副本,他们也无法确定另一个用户的密码。 - Elliott Frisch
哦,但是我需要密码的值,例如在登录中。我需要检查密码。我该怎么做? - mekafe
1
@mekafe 用户将密码提供给您,然后您再次进行哈希;如果哈希值与存储在数据库中的值匹配,则为正确。否则,它是不正确的。要更改密码,请通过其他方式验证用户身份,然后替换密码散列。 - Elliott Frisch
显示剩余4条评论

1

还有一种方法是使用Encrypt类,用随机生成的keyvalue加密您的密码。但您需要将keyvalue存储在数据库中以获取加密后的密码。像这样:

Integer randVal = random.nextInt();
Encrypt encrypt = new Encrypt();
// convert password to encrypted password
String encyppassword = encrypt.encryptText(
Integer.toString(randVal) + "",
your_password);

当您解密时,需要使用密钥值和加密密码。就像这样,
Decrypt decrypt = new Decrypt();
Integer randVal = keyvalue_from_db;
String decryptedPassword = decrypt.decryptText(
    String.valueOf(randVal.toString()),
    encrypted_password);

希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接