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

时间:2015-01-30 07:42:50

标签: jsf-2 passwords client-side mojarra state-saving

在我发现的有关加密ViewState的所有参考页面中,对密码的唯一评论是"您的密码在这里"。

是否有关于我们应该使用的密码长度/复杂性的建议?

1 个答案:

答案 0 :(得分:18)

取决于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

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使用带有completely random key的AES算法。 JNDI条目com.sun.faces.ClientStateSavingPassword现在已经不再了。

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

<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>

您可以使用此issue 2557生成一个(刷新页面以重新生成),或使用以下代码段生成您自己的AES key generator - 编码Base64密钥:

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.