Jasypt | StrongPasswordEncryptor |密码不匹配

时间:2014-05-19 13:00:28

标签: java jasypt

我正在使用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表中插入加密的用户密码。

1 个答案:

答案 0 :(得分:0)

每次运行测试程序都会有所不同,因为StrongPasswordEncryptor每次都会在启动时创建并附加到班级EncryptionUtil,因为它被标记为staticfinal。这意味着所提供的SALT对于StrongPasswordEncryptor

的每个实例也是新的

您需要直接从文档

阅读此内容

在Web应用程序中,Jasypt允许开发人员避免在Web应用程序中的文件中存储PBE加密器的加密密码,而是在每次部署时通过Web界面将这些密码指定给应用程序。

  • 特殊*配置类:org.jasypt.encryption.pbe.WebPBEConfigorg.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