【问题标题】:Encrypting passwords in Crypto property files在 Crypto 属性文件中加密密码
【发布时间】:2015-09-10 11:00:45
【问题描述】:

问题

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

在 apache 网上说:

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

 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 通过 属性文件,它遇到一个格式加密的密码 "ENC(encoded encrypted password)",它向 CallbackHandler 查询一个 通过此 WSPasswordCallback 使用标签的密码。是可以通过的 通过新的 WSS4J 的自定义 PasswordEncryptor 实现 配置标签 ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE ("passwordEncryptorInstance")。

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

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

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

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

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

解决方案

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

  1. 下载jasypt-1.9.2-dist.zip
  2. 使用此命令获取编码密码 加密输入=real_keystore_password 密码=master_password 算法=PBEWithMD5AndTripeDES
  3. 复制输出(例如:0laAaRahTQJzlsDu771tYi)
  4. 在使用此算法时,您需要 Java Cryptography Extension (JCE) Unlimited Strength。放入你的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 等等...但这是另一段历史...谢谢!

【问题讨论】:

    标签: java encryption cxf


    【解决方案1】:

    这个测试应该可以帮助你: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

    科尔姆。

    【讨论】:

    • 感谢您的测试。它现在可以工作了,当我尝试 Jasypt 命令行时,我的密码错误! ;)
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2011-04-15
    • 2016-04-28
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多