代码之家  ›  专栏  ›  技术社区  ›  Evan Knowles

com.sun.faces.ClientStateSavingPassword-实际密码建议?

  •  10
  • Evan Knowles  · 技术社区  · 10 年前

    在我找到的所有关于加密ViewState的参考页面中,对密码的唯一注释是“此处的密码”。

    关于我们应该使用的密码的长度/复杂性,有什么建议吗?

    1 回复  |  直到 10 年前
        1
  •  21
  •   BalusC    7 年前

    取决于Mojarra版本。它在早期版本中有几个缺陷/失败。

    在里面 Mojarra 1.2.x-2.1.18 ,它从未实际使用过。JNDI条目名称被错误地记录。是的 documented com.sun.faces.ClientStateSavingPassword (前缀与 Mojarra's other web.xml context parameters ),但代码 actually 检查 ClientStateSavingPassword 。然后,您应该将其注册到该名称上。

    <env-entry>
        <env-entry-name>ClientStateSavingPassword</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>[Your Password]</env-entry-value>
    </env-entry>
    

    否则,客户端状态为 实际上不是 加密。

    在里面 Mojarra 1.2.x-2.0.3 ,密码 will 用作 SecureRandom seed 生成 DES algorithm key 。因此,一般来说,相同的规则适用于 "real world" passwords 。只是,这很容易 compromised 如果密码“太容易”,并且攻击者成功猜到/bruteforces/figures密码。

    在里面 Mojarra 2.0.4-2.1.x 他们 changed 从DES到AES的算法和代码现在都没有了 actually 不再使用提供的密码来生成密钥(以防止潜在的冲突)。相反,完全随机的密钥是 generated ,这样更安全。JNDI条目现在基本上控制客户机状态是否应该加密。换句话说,它现在的行为就像一个布尔配置条目。因此,您使用哪个密码已不再重要。

    <env-entry>
        <env-entry-name>ClientStateSavingPassword</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>[Any value is interpreted as boolean=true to enable encryption]</env-entry-value>
    </env-entry>
    

    在里面 Mojarra 2.1.19-2.1.x 他们 fixed 用于在JNDI条目名称上对齐文档的代码。因此,您可以使用记录的JNDI条目名称:

    <env-entry>
        <env-entry-name>com.sun.faces.ClientStateSavingPassword</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>[Any value is interpreted as boolean=true to enable encryption]</env-entry-value>
    </env-entry>
    

    然而,这仍然不会影响自2.0.4以来更改的AES密钥,它仍然基本上只启用/禁用加密。

    在里面 Mojarra 2.2.0-2.3.x ,作为的一部分 JSF 2.2 specification (第7.8.2章),客户端状态现在默认为 always 加密。仅在以下情况下禁用 web.xml 上下文参数 com.sun.faces.disableClientStateEncryption 设置为值 true still 将AES算法与 completely random key 。JNDI条目 com.sun.faces.ClientStateSaving密码 现在 不再使用。

    在里面 Mojarra 2.2.6-2.3.x ,他们按照 issue 3087 一个新的JNDI条目,允许您以Base64编码格式指定AES密钥, the jsf/ClientSideSecretKey 。这是在集群环境中使用JSF webapp时客户端状态失败的错误修复的一部分,因为每个服务器使用不同的AES密钥,这只会导致 ERROR: MAC did not verify! 在与保存状态的服务器不同的服务器中恢复状态时,如中所述 issue 2557 .

    <env-entry>
        <env-entry-name>jsf/ClientSideSecretKey</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>[AES key in Base64 format]</env-entry-value>
    </env-entry>
    

    你可以用这个 AES key generator 生成一个(刷新页面以重新生成),或使用下面的代码段生成您自己的 Base64 -已编码的 AES256 键:

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    keyGen.init(256); // Use 128 for AES128 (when server don't have JCE installed).
    String key = Base64.getEncoder().encodeToString(keyGen.generateKey().getEncoded());
    System.out.println(key); // Prints AES key in Base64 format.