在 JDBCRealm 中使用散列密码的 tomcat basic/digest 身份验证的方法?
way to use tomcat basic/digest authentication with hashed passwords in JDBCRealm?
我想使用 Tomcats 基于角色的身份验证,问题是我将散列密码存储在我的数据库中,因此不能使用基本 authentication/or 摘要。有没有办法将明文密码与散列密码进行比较?我正在使用 SHA 来散列密码。
Tomcat 可以散列用户尝试的密码并将其与数据库中的密码进行比较。这不适用于 HTTP DIGEST
,但它应该适用于 HTTP BASIC
。您可能想使用 DataSourceRealm
而不是 JDBCRealm
,因为它的性能会好得多。
只需像这样配置您的 <Realm>
:
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/myDataSource"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"
digest="SHA1" />
显然,您必须自定义上述值以匹配您数据库中的值。
注意一点:如果您的用户数据库被盗,SHA1 散列法不足以保护存储的凭据不被逆向工程。您将需要实施某种密码强化策略来保护您的用户凭据。我会建议尝试从 SHA1 转移到 PBKDF2、bcrypt/scrypt 之类的东西,甚至使用带有盐和非平凡次数(如数千次)的 SHA-512。 Tomcat 的最新版本可以为您处理迭代和加盐,还允许您相当轻松地插入其他函数,例如 bcrypt/scrypt 和 PBKDF2。
我想使用 Tomcats 基于角色的身份验证,问题是我将散列密码存储在我的数据库中,因此不能使用基本 authentication/or 摘要。有没有办法将明文密码与散列密码进行比较?我正在使用 SHA 来散列密码。
Tomcat 可以散列用户尝试的密码并将其与数据库中的密码进行比较。这不适用于 HTTP DIGEST
,但它应该适用于 HTTP BASIC
。您可能想使用 DataSourceRealm
而不是 JDBCRealm
,因为它的性能会好得多。
只需像这样配置您的 <Realm>
:
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/myDataSource"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"
digest="SHA1" />
显然,您必须自定义上述值以匹配您数据库中的值。
注意一点:如果您的用户数据库被盗,SHA1 散列法不足以保护存储的凭据不被逆向工程。您将需要实施某种密码强化策略来保护您的用户凭据。我会建议尝试从 SHA1 转移到 PBKDF2、bcrypt/scrypt 之类的东西,甚至使用带有盐和非平凡次数(如数千次)的 SHA-512。 Tomcat 的最新版本可以为您处理迭代和加盐,还允许您相当轻松地插入其他函数,例如 bcrypt/scrypt 和 PBKDF2。