在我发现的有关加密ViewState的所有参考页面中,对密码的唯一评论是"您的密码在这里"。
是否有关于我们应该使用的密码长度/复杂性的建议?
答案 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.