加密加密属性文件中的密码

时间:2015-06-24 09:47:28

标签: java encryption cxf

问题

我正在使用Apache CXF 3.0.7,并在new features中读取,您可以在加密属性文件中存储(BASE-64编码)密钥库密码的加密版本,但我不知道如何添加它,我没有找到这个实现的例子。

在apache网站上说:

  

Crypto属性文件内容的典型示例(for   签名创建)如下:

 org.apache.wss4j.crypto.provider=org.apache.wss4j.common.crypto.Merlin
 org.apache.wss4j.crypto.merlin.keystore.type=jks
 org.apache.wss4j.crypto.merlin.keystore.password=security
 org.apache.wss4j.crypto.merlin.keystore.alias=wss40
 org.apache.wss4j.crypto.merlin.keystore.file=keys/wss40.jks 
  

请注意,用于加载密钥库的密码是明文。其中一个新的   Apache WSS4J 2.0.0的功能是能够存储一个   (BASE-64编码)加密版的密钥库密码   加密属性文件。定义了一个新的PasswordEncryptor接口   允许加密/解密密码。默认值   现在提供基于Jasypt的实现   JasyptPasswordEncryptor,它使用" PBEWithMD5AndTripleDES"。

     

WSPasswordCallback类还有一个"用法"叫   WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD,用于   返回主密码以与PasswordEncryptor一起使用   实现。当WSS4J通过一个加载Crypto实现时   属性文件,它遇到以格式加密的密码   " ENC(编码加密密码)",它向CallbackHandler查询a   密码通过此WSPasswordCallback使用标记。有可能通过   通过新的自定义PasswordEncryptor实现到WSS4J   配置标记ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE   (" passwordEncryptorInstance&#34)。

     

可以将自定义PasswordEncryptor实现传递给   WSS4J通过新的配置标记   ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE   (" passwordEncryptorInstance&#34)。

我想我必须在我的属性文件中声明类似的内容:

org.apache.wss4j.crypto.merlin.keystore.password=ENC(?????)

但我不知道如何使用默认的JasyptPasswordEncryptor加密我的密码。 另外,我猜想在我的CallbackHandler中我会有类似的东西:

if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){
                ????
    }

解决方案

好的,测试运行后,我测试了我的解决方案,现在正在运行。

  1. 下载jasypt-1.9.2-dist.zip
  2. 使用此命令获取编码密码 encrypt input = real_keystore_password password = master_password algorithm = PBEWithMD5AndTripeDES
  3. 复制OUTPUT(例如:0laAaRahTQJzlsDu771tYi)
  4. 当您使用此算法时,您需要Java密码术扩展(JCE)无限强度。放入你的JDK。
  5. 将编码输出放在属性

    org.apache.wss4j.crypto.provider = org.apache.wss4j.common.crypto.Merlin org.apache.wss4j.crypto.merlin.keystore.type = JKS org.apache.wss4j.crypto.merlin.keystore.password = ENC(0laAaRahTQJzlsDu771tYi) org.apache.wss4j.crypto.merlin.keystore.alias = my_alias org.apache.wss4j.crypto.merlin.keystore.file =的/ etc / CERT / my_keystore.jks

  6. 在CallbackHandler中,输入您用于生成编码的master_password:

    公共类WsPasswordHandler实现了CallbackHandler {

    @Override
    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
        for (Callback callback: callbacks){
            WSPasswordCallback pwdCallback= (WSPasswordCallback) callback;
            final int usage =pwdCallback.getUsage();
            if (usage==WSPasswordCallback.SIGNATURE||usage==WSPasswordCallback.DECRYPT){
                pwdCallback.setPassword("parKeyPassword");
            }
            if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){
                pwdCallback.setPassword("master_password");
            }
        }           
    }
    

    }

  7. 就是这样......现在我已经弄清楚如何使用Spring等外部local.property工作了......但这是另一个历史......谢谢!< / p>

1 个答案:

答案 0 :(得分:4)

此测试可以帮助您:https://svn.apache.org/repos/asf/webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/message/PasswordEncryptorTest.java

您可以通过使用主密码实例化JasyptPasswordEncryptor来获取加密密码,如测试中所示,并加密密钥库密码。然后将其复制到您的加密属性中:

https://svn.apache.org/repos/asf/webservices/wss4j/trunk/ws-security-dom/src/test/resources/crypto_enc.properties

科尔姆。