Tomcat - 了解CredentialHandler

时间:2015-08-24 09:29:46

标签: java tomcat authentication

我最近需要使用容器管理安全和身份验证 项目。我有几个关于如何配置a的问题 凭证处理程序。

  1. 首先CredentialHandler宣言如何?的能 有人提供了NestedCredentialHandler的示例声明 声明的算法属性。我需要知道自Digest属性 在Realms已被弃用。我在网上找不到任何例子 我完全糊涂了。
  2. MessageDigestCredentialHandlerSecretKeyCredentialHandler之间的区别是什么? SecretKeyCredentialHandler哪一个更安全?
  3. PBKDF2WithHmacSHA1指定中只有一个算法 documentation #!/bin/bash # list letter parseLetter=('a' 'b') # change path cd $path/scrapy/scrapyTodo/scrapyTodo tLen=${#parseLetter[@]} for (( i=0; i<${tLen}; i++ )); do scrapy crawl root -a alpha=${parseLetter[$i]} & done 。还有什么算法 可用?

3 个答案:

答案 0 :(得分:9)

回答第一点,这里是切换到Tomcat 8之前和之后我的context.xml中<Realm>的比较:

<强>之前:

<Realm className="org.apache.catalina.realm.DataSourceRealm"
       dataSourceName="jdbc/myDataSource"  
       roleNameCol="role" userCredCol="password" userNameCol="loginid" 
       digest="md5" 
       userRoleTable="userroles" userTable="users" 
       localDataSource="true" />

<强>后:

<Realm className="org.apache.catalina.realm.DataSourceRealm" 
       dataSourceName="jdbc/myDataSource" 
       roleNameCol="role" userCredCol="password" userNameCol="loginid"      
       userRoleTable="userroles" userTable="users" localDataSource="true">
       <CredentialHandler
          className="org.apache.catalina.realm.MessageDigestCredentialHandler"     
 algorithm="md5" />
</Realm>

答案 1 :(得分:2)

NestedCredentialHandler适用于有多种摘要方法的情况,例如您以前使用过MessageDigest但现在要切换更安全的PBKDF2-SHA512配置,并且不想使已配置的密码无效

例如:

<CredentialHandler className="org.apache.catalina.realm.NestedCredentialHandler">
   <CredentialHandler className="org.apache.catalina.realm.SecretKeyCredentialHandler"
                      algorithm="PBKDF2WithHmacSHA512"
                      iterations="100000"
                      keyLength="256"
                      saltLength="16"
   />
   <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler"
                      algorithm="SHA-256"
                      iterations="1000"
                      keyLength="256"
                      saltLength="8"
   />
</CredentialHandler>

<!-- NOTE: keyLength is in bits, saltLength is in bytes. 16 bytes = 128 bits -->

这将进入您的Realm元素。

SecretKeyCredentialHandler是在Tomcat 8.0.15中引入的,它使用javax.crypto API中的SecretKeyFactory而不是旧方法(MessageDigest)来改变密码。 SecretKeyFactory允许更好的算法,如PBKDF2和HMAC-SHA-512,而不是普通的哈希算法,如SHA-512。之后的旧方法可通过MessageDigestCredentialHandler获得,这相当于直接在Realm元素上设置摘要属性。

请注意,直接设置摘要属性或使用MessageDigestCredentialHandler而不使用可选的迭代属性(仅限8.0.15+)只会进行一次迭代。 这不安全

至于SecretKeyFactory可用的算法,Java Cryptography Architecture Standard Algorithm Name Documentation for JDK 8是我能找到的最佳参考,但它没有明确列出所有组合。这些是我在我的平台上发现的(Linux 3.13.0,Oracle JDK 1.8.0_111),但你的可能支持其他组合。

  • PBKDF2WithHmacSHA1
  • PBKDF2WithHmacSHA224
  • PBKDF2WithHmacSHA256
  • PBKDF2WithHmacSHA384
  • PBKDF2WithHmacSHA512
  • PBEWithMD5AndDES
  • PBEWithSHA1AndDESede
  • DES
  • DESede

答案 2 :(得分:0)

我需要将相同的myapp.war二进制文件部署到Tomcat7和Tomcat8环境。使用此配置,两个环境都可以正常工作。

<强> MyApp的/ META-INF / context.xml中

<Realm className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="jdbc/myapp" localDataSource="true" digest="SHA-256"
    userTable="user_role_v"     userNameCol="username" userCredCol="password"   
    userRoleTable="user_role_v" roleNameCol="role">
    <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" 
       algorithm="SHA-256" iterations="1" saltLength="0" encoding="ISO-8859-1" />
  </Realm>

您在启动时在catalina日志文件中看到未知参数的警告但无关紧要。