Java Jasypt | StrongPasswordEncryptor |密码不匹配
我正在使用Jasypt对用户密码进行编码并进行匹配 我创建了一个util类来调用其API:-Java Jasypt | StrongPasswordEncryptor |密码不匹配,java,jasypt,Java,Jasypt,我正在使用Jasypt对用户密码进行编码并进行匹配 我创建了一个util类来调用其API:- public class EncryptionUtil { private static final StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor(); /** * Default private constructor. */ private EncryptionUtil() { } /**
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进行了一些研究之后,我发现对于相同的普通密码(比如“password”),在多次运行时,生成的加密密码是不同的
i、 e:-
@Test
public void test() {
String encryptedPassword = EncryptionUtil.encyptString("password");
System.out.println(encryptedPassword);
}
这将在每次运行时打印不同的加密字符串。
我不是加密专家,但我相信StrongPasswordEncryptor在每次运行中使用的salt是不同的
我该如何解决这个问题
我应该能够在通过凭据匹配流的SQL表中插入加密的用户密码。每次运行测试程序都会有所不同,因为,
StrongPasswordEncryptor
将在每次启动时创建,并附加到类EncryptionUtil
,因为它标记为静态
和最终
。这意味着提供的SALT对于StrongPasswordEncryptor
您需要直接从文档中阅读此内容
在web应用程序中,Jasypt允许开发人员避免将PBE加密机的加密密码存储在webapp内的文件中,而是在每次部署应用程序时通过web界面向应用程序指定这些密码
- 特殊*Config类:
和org.jasypt.encryption.pbe.WebPBEConfig
,当分配给 加密机,“标记”此加密机有资格接收其 通过网络输入密码org.jasypt.encryption.pbe.WebStringPBEConfig
- 上下文侦听器,
将让我们创建加密机,将其设置为WebPBEConfig 配置并在应用程序中的某个位置注册它们。这一背景 如果我们使用的是Spring框架,那么监听器就没有必要了org.jasypt.web.pbeconfig.WebPBEInitializationContextListener
- 一个过滤器,
,它将 在加密之前,避免任何用户访问web应用程序 密码已由管理员设置org.jasypt.web.pbeconfig.WebPBEConfigFilter
- 一个servlet,
,它将 向授权用户显示一张表格,他/她可以使用该表格设置 使用WebPBEConfig的所有加密机的加密密码org.jasypt.web.pbeconfig.WebPBEConfigServlet
请从我看来不错的地方完整地读一遍。您是否在没有多次重新启动/部署应用程序的情况下验证了测试用例?我认为,salt是在输出前加上的。因此,您的代码应该可以正常工作。也许是你的数据库存储/检索造成的?@Octopus不,我没有。为什么每次运行的加密数据都不同?查看StrongPasswordEncryptor的源代码,其默认构造函数(每次应用程序启动/重新启动时都会调用)的最后一个语句为“this.digester.initialize();”。我无法理解它的用途。是的,它需要在每次应用程序重新启动时进行初始化。如果没有初始化,您怎么能期望它工作?是的,它会有所不同。这同样适用于我的应用程序(web应用程序)重新启动/重新部署。加密字符串不应该每次都相同吗?是的,您可以这样做。
JAsypt
提供了几种方法。请阅读我的最新答案。