我对org.apache.commons.codec.digest.Md5Cryp的正确用法有疑问。 在jar中你可以找到方法
public static String md5Crypt(final byte[] keyBytes)
在内部生成随机盐,然后返回加密的字符串。 但是我想知道这个功能应该有什么好处,因为在不知道盐的情况下,我将永远无法再次检索相同的加密字符串。 另一方面,库不提供像getRandomSalt()这样的方法。 请问有人应该如何使用这个库吗?
答案 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,(或更好)PBKDF2
或bCrypt
。 MD5是一种相当快速的散列算法,并非设计用于散列密码。它的速度使它对文件完整性验证这样的事情有好处,但即使用盐也不利于密码哈希。
答案 1 :(得分:0)
得到答案,这很容易(我的上帝!): 返回的字符串包含salt,例如:
$ 1 $ $ XYpZthWO RHlJfrViJBZAOTRrGXRki /
$ sign是字符串部分的分隔符......