【问题标题】:Jasypt | StrongPasswordEncryptor | Password not matching杰西普特 |强密码加密器 |密码不匹配
【发布时间】: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();”。我无法理解它的目的。
  • 是的,每次应用程序重新启动时都需要对其进行初始化。你怎么能指望它在没有初始化的情况下工作?

标签: java jasypt


【解决方案1】:

每次运行测试程序都会有所不同,因为StrongPasswordEncryptor 将在每次启动期间创建并附加到类EncryptionUtil,因为它被标记为staticfinal。这意味着提供的 SALT 对于StrongPasswordEncryptor 的每个实例也是新的

您需要直接从文档中阅读此内容

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

  • 特殊 *Config 类:org.jasypt.encryption.pbe.WebPBEConfigorg.jasypt.encryption.pbe.WebStringPBEConfig,分配给 一个加密器,“标记”这个加密器有资格接收它的 网络密码。

  • 一个上下文监听器, org.jasypt.web.pbeconfig.WebPBEInitializationContextListener哪个 将让我们创建我们的加密器,将它们设置为 WebPBEConfig 配置并在我们的应用程序中注册它们。这个语境 如果我们使用 Spring 框架,监听器将是不必要的。

  • 一个过滤器,org.jasypt.web.pbeconfig.WebPBEConfigFilter,它将 在加密之前避免任何用户访问 Web 应用程序 密码已由管理员设置。

  • 一个 servlet,org.jasypt.web.pbeconfig.WebPBEConfigServlet,它将 向授权用户展示一个表单,他/她可以使用该表单设置 使用 WebPBEConfig 的所有加密器的加密密码。

请完整阅读Documentation

【讨论】:

  • 是的,它会有所不同。这同样适用于我的应用程序(Web 应用程序)重新启动/重新部署。加密的字符串不应该每次都一样吗?
  • 是的,你可以做到。JAsypt 提供了几种方法来做到这一点。请阅读我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多