【发布时间】:2014-05-19 21:30:12
【问题描述】:
我正在使用 Jasypt 的 StrongPasswordEncryptor 来编码用户的密码并进行匹配。
我创建了一个 util 类来调用它的 API:-
public class EncryptionUtil {
private static final StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
/**
* Default private constructor.
*/
private EncryptionUtil() {
}
/**
* Encrypts a string using {@link StrongPasswordEncryptor}
*
* @param input
* Plain string
* @return encrypted string.
*/
public static final String encyptString(final String input) {
return passwordEncryptor.encryptPassword(input);
}
/**
* @see StrongPasswordEncryptor#checkPassword(String, String)
* @param plainPassword
* @param encryptedPassword
* @return boolean
*/
public static boolean checkPassword(String plainPassword, String encryptedPassword) {
return passwordEncryptor
.checkPassword(plainPassword, encryptedPassword);
}
}
尝试使用 Junit 测试它运行得非常好:-
@Test
public void test() {
String encryptedPassword = EncryptionUtil.encyptString("password");
Assert.assertNotNull(encryptedPassword);
Assert.assertTrue(EncryptionUtil.checkPassword("password",
encryptedPassword));
}
我将用户凭据存储在 SQL 表中。对于测试/开发环境,我在使用 EncryptionUtil 类加密密码后进行了 SQL 插入。
问题:-
一旦将凭据部署/运行到其他机器上,凭据匹配就会失败 - 当从数据库中获取凭据进行匹配时。
在使用 StrongPasswordEncryptor#encyptString 玩了一下之后,我发现对于相同的普通密码(比如“密码”),多次运行时生成的加密密码是不同的。
即:-
@Test
public void test() {
String encryptedPassword = EncryptionUtil.encyptString("password");
System.out.println(encryptedPassword);
}
这将在每次运行时打印不同的加密字符串。 我不是加密专家,但我相信 StrongPasswordEncryptor 使用的盐在每次运行时都不同。
我该如何解决这个问题?
我应该能够在通过凭据匹配流程的 SQL 表中插入加密的用户密码。
【问题讨论】:
-
我觉得不错。您是否在没有多次重新启动/部署应用程序的情况下验证了测试用例?
-
盐是输出的前缀,我想。所以你的代码应该可以正常工作。也许你的数据库存储/检索是罪魁祸首?
-
@Octopus 不,我没有。为什么每次运行的加密都不同?查看 StrongPasswordEncryptor 的源代码,它的默认构造函数(每次我的应用程序启动/重新启动时都会调用)最后一条语句为“this.digester.initialize();”。我无法理解它的目的。
-
是的,每次应用程序重新启动时都需要对其进行初始化。你怎么能指望它在没有初始化的情况下工作?