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

问题

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

在apache网站上说:

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

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的一个新function是能够在Crypto属性文件中存储(BASE-64编码)密钥库密码的加密版本。 定义了新的PasswordEncryptor接口以允许加密/解密密码。 现在基于Jasypt提供了一个名为JasyptPasswordEncryptor的默认实现,它使用“PBEWithMD5AndTripleDES”。

WSPasswordCallback类还有一个名为WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD的“用法”,用于返回用于PasswordEncryptor实现的主密码。 当WSS4J通过属性文件加载Crypto实现,并且遇到以“ENC(编码加密密码)”格式加密的密码时,它会通过此WSPasswordCallback用法标记向CallbackHandler查询密码。 可以通过新配置标记ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE(“passwordEncryptorInstance”)将自定义PasswordEncryptor实现传递给WSS4J。

可以通过新配置标记ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE(“passwordEncryptorInstance”)将自定义PasswordEncryptor实现传递给WSS4J。

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

 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"); } } } 

    }

这就是它……现在我要弄清楚如何在外部local.property中使用Spring,等等……但这是另一个历史……谢谢!

此测试应该可以帮助您: 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

科尔姆。