Eva*_*les 8 passwords client-side jsf-2 mojarra state-saving
在我发现的关于加密ViewState的所有参考页面中,对密码的唯一评论是"您的密码在这里".
是否有关于我们应该使用的密码长度/复杂性的建议?
Bal*_*usC 19
取决于Mojarra版本.它在早期版本中有几个缺陷/失败.
在Mojarra 1.2.x - 2.1.18中,它从未真正使用过.JNDI条目名称未正确记录.它被记录为com.sun.faces.ClientStateSavingPassword
(与Mojarra的其他web.xml
上下文参数具有相同的前缀),但代码实际上会检查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>
Run Code Online (Sandbox Code Playgroud)
否则,客户端状态实际上未加密.
在Mojarra 1.2.x - 2.0.3中,密码将用作生成DES算法密钥的SecureRandom
种子.因此,通常,相同的规则适用于"真实世界"密码.只是,如果密码"太简单"并且攻击者成功猜测/强制/计算密码,这很容易受到损害.
在Mojarra 2.0.4 - 2.1.x中,他们将算法从DES 更改为AES,现在代码实际上不再使用提供的密码来生成密钥(以防止潜在的包含).取而代之的,是一个完全随机密钥生成,这是更安全的.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>
Run Code Online (Sandbox Code Playgroud)
在Mojarra 2.1.19 - 2.1.x中,他们修复了代码以使文档与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>
Run Code Online (Sandbox Code Playgroud)
但是,这仍然不会影响自2.0.4以来更改的AES密钥,它仍然基本上只启用/禁用加密.
在Mojarra 2.2.0 - 2.3.x中,作为JSF 2.2规范(第7.8.2章)的一部分,客户端状态现在默认始终是加密的.仅当web.xml
上下文参数com.sun.faces.disableClientStateEncryption
设置为value 时,才会禁用它true
.它仍然使用AES算法和完全随机的密钥.JNDI条目com.sun.faces.ClientStateSavingPassword
现在不再使用了.
在钻嘴鱼科2.2.6 - 2.3.x版本,他们增加了按发行3087一个新的JNDI条目,它允许您指定Base64编码格式的AES密钥的jsf/ClientSideSecretKey
.这是在群集环境中使用JSF webapp时失败的客户端状态的错误修复的一部分,因为每个服务器使用不同的AES密钥,这只会导致ERROR: MAC did not verify!
在与保存状态的服务器不同的服务器中恢复何时状态,如问题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>
Run Code Online (Sandbox Code Playgroud)
您可以使用此AES密钥生成器生成一个(刷新页面以重新生成),或使用下面的代码段生成您自己的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.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2557 次 |
最近记录: |