0

假设:我们已经将国际消息资源加密成一个jar文件。我们使用 ResourceBundle.getBundle(BUNDLE_NAME) 来获取加密前的消息资源。

问题:将所有资源jared到文件后如何读取消息资源?

4

1 回答 1

0

我看到两种可能性:

  1. 自己加载:当整个资源文件被加密时,你需要自己处理它的加载。由于 Jar 文件只是 zip 包,因此您可以提取任何内容。因此,您可以读取和解密正确的属性文件,然后将其作为 ResourceBundle 加载。请参阅以下库以访问 jar 资源: https ://github.com/IsNull/archimedesJ/blob/master/src/archimedesJ/util/PackageUtil.java 以及以下加载正确文件的策略: http://docs。 oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String%2C%20java.util.Locale%2C%20java.lang.ClassLoader)

  2. 注入 ResourceBundle代理:如果您只加密属性文件的值,您可以坚持使用 ResourceBundle.getBundle(BUNDLE_NAME)。现在,由于字符串被加密,它将返回垃圾。因此,您只需将 ResourceBundle 包装在自定义代理中即可解密这些值:

使用示例:

ResourceBundle mybundle = new EncryptedResourceBundle(ResourceBundle.getBundle(BUNDLE_NAME), "mypassword");

您将 EncryptedResourceBundle 定义为 ResourceBundle 的子类,并代理所有公共方法并将它们重定向到底层原始方法。也覆盖“getString”方法,但现在您可以透明地动态解密返回的值:

public class EncryptedResourceBundle extends ResourceBundle
    private final ResourceBundle original;
    private final String password;

    public EncryptedResourceBundle(ResourceBundle original, String password){
        this.original = original;
        this.password = password;
    }

    ... // proxy all public methods here

    @Overwrite
    public String getString(String key){

        String encrypted = original.getString(key);

        return decrypt(encrypted, password);
    }

    private String decrypt(String data, String password){
        ...
    }

}

如果安全性很重要,您可能不想存储真实密码,而是使用从原始密码派生的令牌。

于 2013-04-26T10:18:07.260 回答