假设:我们已经将国际消息资源加密成一个jar文件。我们使用 ResourceBundle.getBundle(BUNDLE_NAME) 来获取加密前的消息资源。
问题:将所有资源jared到文件后如何读取消息资源?
假设:我们已经将国际消息资源加密成一个jar文件。我们使用 ResourceBundle.getBundle(BUNDLE_NAME) 来获取加密前的消息资源。
问题:将所有资源jared到文件后如何读取消息资源?
我看到两种可能性:
自己加载:当整个资源文件被加密时,你需要自己处理它的加载。由于 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)
注入 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){
...
}
}
如果安全性很重要,您可能不想存储真实密码,而是使用从原始密码派生的令牌。