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

Java 如何正确使用org.apache.commons.codec.digest.Md5Crypt?,java,encryption,Java,Encryption,我对org.apache.commons.codec.digest.Md5Cryp的正确用法有一个问题。 在jar中可以找到方法 public static String md5Crypt(final byte[] keyBytes) 它在内部生成一个随机salt,然后返回一个加密字符串。 但是我想知道这个函数应该有什么好处,因为在不知道salt的情况下,我将永远无法再次检索相同的加密字符串。 另一方面,该库不提供类似getRandomSalt()的方法。 有谁能指出应该如何使用这个图书馆吗?

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

public static String md5Crypt(final byte[] keyBytes)
它在内部生成一个随机salt,然后返回一个加密字符串。 但是我想知道这个函数应该有什么好处,因为在不知道salt的情况下,我将永远无法再次检索相同的加密字符串。 另一方面,该库不提供类似getRandomSalt()的方法。
有谁能指出应该如何使用这个图书馆吗?

得到了答案,它太简单了(我的上帝!) 返回的字符串包含盐,例如:

$1$XYpZthWO$RHLJFRVIJBZAOTRRRGXRKI/


$符号是字符串部分的分隔符…

要验证您使用
md5Crypt
加密的值,请使用
md5Crypt(byte[],string)
方法,其中字符串是您已经拥有的加密值,然后比较两个加密字符串以查看它们是否相同

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)
方法的加密字符串中提取salt值


另外,我不知道您的用例是什么,但如果这是用于存储任何类型的凭据,我建议使用Apache commons
Sha2Crypt
类中包含的
SHA512
(或者更好的是)
PBKDF2
bCrypt
。MD5是一种相当快的散列算法,并不是设计用来散列密码的。它的速度使其适用于文件完整性验证之类的事情,但不适用于密码散列(即使使用salt)。

该类中的所有方法都参考方法以了解详细信息,其中定义了输出字符串的结构。