【问题标题】:Encrypt and decrypt a password in Java [closed]在Java中加密和解密密码[关闭]
【发布时间】:2011-09-29 08:07:39
【问题描述】:

我想用Java加密和解密密码并以加密的形式存储到数据库中。 如果它是开源的,那就太好了。有什么建议/指点吗?

【问题讨论】:

  • 唯一的建议是不要使用加密。使用 Hash... 可能需要一些 Salt。
  • @Nishant:你有什么例子可以让我更好地理解。
  • 将此任务使用mindrot.org/projects/jBCrypt
  • 请参阅password-encryption 了解为什么不这样做。

标签: java encryption


【解决方案1】:

EDIT :这个答案是旧的。现在不鼓励使用 MD5,因为它很容易被破解。


我想MD5对你来说一定足够好了吧?您可以通过MessageDigest 实现它。

MessageDigest.getInstance("MD5");

还列出了其他算法here

如果你真的想要,这里是它的第三方版本: Fast MD5

【讨论】:

  • md5 仅是单向哈希。您无法解密。
  • +1。 @avs31586,你真的不需要解密密码。相反,您使用 MD5 加密,然后在检查时始终检查两个 MD5。有点让你解决人们猜测你的加密算法的问题
  • 糟糕。错过了解密部分......虽然在存储密码时这可能不会有太大区别,但我投票给 Kal。
  • 我知道这是一个老问题,但请切勿使用 md5 来“加密”密码。 md5 不安全,很容易被解密。
【解决方案2】:

Jasypt 可以为你轻松简单地搞定

【讨论】:

  • 现在正在处理类似的事情......因为听起来你确实需要在某些时候解密密码,所以像 MD5 这样的东西将不起作用。我认为这是最简单的解决方案。
  • @JasonStoltz 如何在 Jasypt 中添加盐?
【解决方案3】:

您可以使用java.security.MessageDigestSHA 作为您的算法选择。

供参考,

Try available example here

【讨论】:

  • 你的例子很棒。但它不提供解密。你有解密的想法吗?
  • 使用Base64DecoderExample here
  • org.apache.commons.codec.binary.Base64需要哪个包;
  • Base64编码和加解密有什么关系?什么都没有。
  • Base64 编码不是加密,存储在 Base64 中的任何内容都可以轻松获知。里面没有保护。你们有人在可能有我的钱的银行或金融机构工作吗?亲爱的上帝,我希望不是!
【解决方案4】:

我最近为此使用了 Spring Security 3.0(与 Wicket btw 结合使用),并且对此非常满意。这是一个很好的thorough tutorialdocumentation。另请查看this tutorial,它很好地解释了 Spring Security 2 的散列/加盐/解码设置。

【讨论】:

    【解决方案5】:

    这是我使用 MD5 加密的算法。它返回您的加密输出。

       public class CryptWithMD5 {
       private static MessageDigest md;
    
       public static String cryptWithMD5(String pass){
        try {
            md = MessageDigest.getInstance("MD5");
            byte[] passBytes = pass.getBytes();
            md.reset();
            byte[] digested = md.digest(passBytes);
            StringBuffer sb = new StringBuffer();
            for(int i=0;i<digested.length;i++){
                sb.append(Integer.toHexString(0xff & digested[i]));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(CryptWithMD5.class.getName()).log(Level.SEVERE, null, ex);
        }
            return null;
    
    
       }
    }
    

    您无法解密 MD5,但您可以比较输出,因为如果您在此方法中放入相同的字符串,它将具有相同的加密输出。如果您想解密,您需要使用 SHA。您永远不会使用解密用户密码。为此始终使用 MD5。该异常非常多余。它永远不会抛出它。

    【讨论】:

    • @AdrianStamin 你能解释一下0xff &amp; digested[i] 的作用吗? :)
    • md5 不安全(很容易解密),绝对不能用于密码。
    • @theapache64 digested[i] & 0xff 确保只有 digested[i] 的 8 个最低有效位可以是非零的。 0xff 以十进制为 255,以二进制为 00000000 00000000 00000000 11111111 当您对任何字节进行按位运算 AND (&) 时,它将确保结果数字中只有最不重要的位可以是非零。示例:00000000 00000000 00000000 11111111 (255) & 00000000 00011111 00000000 01000000 (8000) => 00000000 00000000 00000000 01000000
    • @alttag 你是对的。 MD5 不安全。现在人们使用盐渍MD5。存储密码的最好方法是让其他人来做。喜欢 facebook 或 yahoo :)
    • @AdrianStamin :即使是加盐的 MD5 也是一个坏主意。腌制很好,但用破碎的哈希腌制仍然是破碎的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2018-06-05
    • 2012-01-13
    • 2012-01-10
    • 1970-01-01
    • 2012-05-28
    • 2021-01-04
    相关资源
    最近更新 更多