我正在使用Jasypt的StrongPasswordEncryptor来编码用户的密码并进行匹配。
我创建了一个utilc来调用它的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表中插入加密的用户密码。
答案 0 :(得分:0)
每次运行测试程序都会有所不同,因为StrongPasswordEncryptor
每次都会在启动时创建并附加到班级EncryptionUtil
,因为它被标记为static
和final
。这意味着所提供的SALT对于StrongPasswordEncryptor
您需要直接从文档
阅读此内容在Web应用程序中,Jasypt允许开发人员避免在Web应用程序中的文件中存储PBE加密器的加密密码,而是在每次部署时通过Web界面将这些密码指定给应用程序。
特殊*配置类:org.jasypt.encryption.pbe.WebPBEConfig
和
org.jasypt.encryption.pbe.WebStringPBEConfig
,分配给时
加密器,“标记”此加密器有资格接收它
通过网络密码。
上下文侦听器,
org.jasypt.web.pbeconfig.WebPBEInitializationContextListener
哪个
让我们创建我们的加密器,将它们设置为WebPBEConfig
配置并在我们的应用程序中的某处注册它们。这个背景
如果我们使用Spring Framework,则不需要监听器。
过滤器org.jasypt.web.pbeconfig.WebPBEConfigFilter
,将会
在加密之前,请避免任何用户访问Web应用程序
密码已由管理员设置。
一个servlet,org.jasypt.web.pbeconfig.WebPBEConfigServlet
,它将
向授权用户显示他/她可以设置的表格
使用WebPBEConfig的所有加密器的加密密码。
请完整阅读Documentation