0

Hibernate 应用程序(无 spring-boot)使用 Jasypt-1.9.3 从属性文件中解密数据库密码。它像罐子一样工作得很好。但是,当使用 prunsrv.exe(Commons Daemon Service Runner)将 jar 文件作为 Windows 服务运行时,它会给出org.jasypt.exceptions.EncryptionOperationNotPossibleException(同样,当 DB 密码未加密时,将 jar 作为 Windows 服务运行没有问题)。我附上了解密发生的代码片段。使用的盐被声明为 env't variable JASYPT_ENCRYPTOR_PASSWORD

        Properties properties = new Properties();
        ResourceBundle options = Helper.getResourceFile(System.getProperty("user.dir") + "/system.properties");
        StandardPBEStringEncryptor  encryptor = new StandardPBEStringEncryptor();
        String salt = System.getenv("JASYPT_ENCRYPTOR_PASSWORD");
        String dbPassword = options.getString("db_password");
        if (salt != null && dbPassword.startsWith("ENC(")) {
            dbPassword = dbPassword.replace("ENC(", "");
            dbPassword = dbPassword.substring(0, dbPassword.lastIndexOf(")"));
            encryptor.setPassword(salt);
            encryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
            encryptor.setIvGenerator(new RandomIvGenerator());
            dbPassword = encryptor.decrypt(dbPassword);
        }

        properties.setProperty("hibernate.connection.username", options.getString("db_user"));
        properties.setProperty("hibernate.connection.password", dbPassword);
        properties.setProperty("hibernate.connection.url", "jdbc:jtds:sqlserver://" + options.getString("db_url") + ":" + options.getString("db_port") + "/" + options.getString("db_name") + ";characterEncoding=UTF-8;TDS=7.0");
        return new AnnotationConfiguration().configure().mergeProperties(properties).buildSessionFactory();

我认为这与某种 Windows 服务配置/权限有关。有哪些可能的检查事项?

提前致谢

4

1 回答 1

0

解决了这个问题。我忽略了一个非常简单的步骤。当使用 prunsrv.exe 运行 Windows 服务时,会有一个 .bat 文件将 jar 安装为服务。由于我已向包含属性文件加密/解密的 java 应用程序添加了新功能,因此我需要将 jar 重新安装为服务,假设只是从 Windows 服务停止并启动它。因此,重新运行 .bat 文件解决了我的问题。

于 2021-10-14T13:55:51.453 回答