我如何正确使用org.apache.commons.codec.digest.Md5Crypt?

时间:2014-07-08 16:30:50

标签: java encryption

我对org.apache.commons.codec.digest.Md5Cryp的正确用法有疑问。 在jar中你可以找到方法

public static String md5Crypt(final byte[] keyBytes)

在内部生成随机盐,然后返回加密的字符串。 但是我想知道这个功能应该有什么好处,因为在不知道盐的情况下,我将永远无法再次检索相同的加密字符串。 另一方面,库不提供像getRandomSalt()这样的方法。 请问有人应该如何使用这个库吗?

2 个答案:

答案 0 :(得分:1)

要验证您使用md5Crypt加密的值,请使用md5Crypt(byte[], String)方法,其中字符串是您已有的加密值,然后比较两个加密的字符串以查看它们&# 39;同样的。

String somevalue = "somevalue"; 
String encrypted1 = Md5Crypt.md5Crypt(somevalue.getBytes());
String encrypted2 = Md5Crypt.md5Crypt(somevalue.getBytes(), encrypted1);
String encrypted3 = Md5Crypt.md5Crypt(somevalue.getBytes());
System.out.println("encrypted1==encrypted2: " + encrypted1.equals(encrypted2));
System.out.println("encrypted1==encrypted3: " + encrypted1.equals(encrypted3));

Output:
encrypted1==encrypted2: true
encrypted1==encrypted3: false

内部md5Crypt正在从您传入md5Crypt(byte[], String)方法的加密String中提取salt值。

另外,我不知道您的用例是什么,但如果这是用于存储任何类型的凭据,我建议使用Apache公共中包含的SHA512 Sha2Crypt } class,(或更好)PBKDF2bCrypt。 MD5是一种相当快速的散列算法,并非设计用于散列密码。它的速度使它对文件完整性验证这样的事情有好处,但即使用盐也不利于密码哈希。

答案 1 :(得分:0)

得到答案,这很容易(我的上帝!): 返回的字符串包含salt,例如:

  

$ 1 $ $ XYpZthWO RHlJfrViJBZAOTRrGXRki /

$ sign是字符串部分的分隔符......