预设: 我们已将国际消息资源加密到jar文件中。 我们使用ResourceBundle.getBundle(BUNDLE_NAME)在加密前获取消息资源。
问题: 在jared all resouces to a file之后,如何阅读消息资源?
答案 0 :(得分:0)
我看到两种可能性:
自己加载: 完整资源文件加密后,您需要自己处理它。 由于Jar文件只是zip包,因此您可以提取任何内容。因此,您可以读取和解密正确的属性文件,然后将其作为ResourceBundle加载。 请参阅以下lib以访问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 Proxy : 如果您只加密属性文件的值,则可以坚持使用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){
...
}
}
如果安全性很重要,您可能不希望存储真实密码,而是使用从原始密码派生的令牌。