如何获取加密资源包?

时间:2013-04-26 09:41:39

标签: java encryption resources bundle message

预设: 我们已将国际消息资源加密到jar文件中。 我们使用ResourceBundle.getBundle(BUNDLE_NAME)在加密前获取消息资源。

问题: 在jared all resouces to a file之后,如何阅读消息资源?

1 个答案:

答案 0 :(得分:0)

我看到两种可能性:

  1. 自己加载: 完整资源文件加密后,您需要自己处理它。 由于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)

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

  3. 用法示例:

    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){
            ...
        }
    
    }
    

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