【问题标题】:JSP simple password encryption decryptionJSP简单密码加密解密
【发布时间】:2013-12-30 19:49:31
【问题描述】:

我需要加密密码才能插入数据库。此外,当我需要该密码时,我需要解密这个值。这样做的简单方法是什么?

注意:这个操作不一定很安全。

【问题讨论】:

    标签: java jsp encryption


    【解决方案1】:

    请不要实施您当前的计划,而应使用MessageDigest 来完成此操作。将单向加密哈希函数应用于用户密码(例如 SHA-256、SHA-384 和 SHA-512 [还有其他] 之一)和 SALT 以防止基于 rainbow table 的攻击。最后,对于密码重置,只需替换当前密码哈希即可。

    举个例子,

    // 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
    

    展示一个字符产生的哈希值有多么不同。

    【讨论】:

    • 不应该是“只需替换当前密码哈希”吗?
    • 哦!我明白了,但我没有太多时间。那么有没有代码可以做到这一点?我尝试了一些方法但无法做到。
    • @Ellios 非常感谢。我怎样才能解密这个哈希值?
    • @mekafe 你没有。这就是重点。用户是唯一可以提供“正确”密码的人。即使有人获得了您的密码数据库的副本,他们也无法确定其他用户的密码。
    • @mekafe 用户给你他们的密码,然后你再次散列它;如果散列值与存储在数据库中的值匹配,则它是正确的。否则,它是不正确的。要更改密码,请通过其他方式验证用户身份,然后替换密码哈希。
    【解决方案2】:

    另一种方法是使用 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);
    

    解密时需要用到keyvalue和加密密码。像这样,

    Decrypt decrypt = new Decrypt();
    Integer randVal = keyvalue_from_db;
    String decryptedPassword = decrypt.decryptText(
        String.valueOf(randVal.toString()),
        encrypted_password);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2014-06-28
      • 2017-12-20
      • 1970-01-01
      相关资源
      最近更新 更多