SHA-1 哈希在 jboss 使用自定义 REALM 的基于表单的身份验证中不起作用
SHA-1 hashing not working in jboss form based authentication using custom REALM
在我的应用程序中,密码是使用 SHA-1 加密的,
public static String passwordEncryption(String password){
MessageDigest md =null;
try {
md= MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md.update(password.getBytes());
byte[] mdbytes = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
我正在使用 Jboss 具有自定义领域的基于表单的身份验证,现在的问题是即使使用正确的密码也无法登录用户,每次都会重定向到错误页面。
我在 standalone.xml 的领地是
<security-domain name="testRealm" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/sbos"/>
<module-option name="principalsQuery" value="SELECT PASSWORD FROM USER WHERE NAME = ?"/>
<module-option name="hashAlgorithm" value="SHA-1"/>
<module-option name="hashEncoding" value="base64"/>
<module-option name="rolesQuery" value="SELECT 'Manager','Manager' FROM user WHERE name = ?"/>
</login-module>
</authentication>
</security-domain>
我建议您将审计元素添加到您的安全域,如下所示:
<audit>
<provider-module code="LogAuditProvider"/>
</audit>
然后在子系统日志记录下添加以下内容(如果还没有的话):
<periodic-rotating-file-handler name="AUDIT" autoflush="true">
<level name="TRACE"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="audit.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="org.jboss.security">
<level name="TRACE"/>
<handlers>
<handler name="AUDIT"/>
</handlers>
</logger>
然后您可以检查 audit.log 以了解有关您的错误的更多详细信息。
hashEncoding默认值为base64。你必须通过将 hashEncoding 更改为 hex 来解决这个问题,因为 SHA-1 使用十六进制编码。
<module-option name="hashAlgorithm" value="SHA-1"/>
<module-option name="hashEncoding" value="hex"/>
在我的应用程序中,密码是使用 SHA-1 加密的,
public static String passwordEncryption(String password){
MessageDigest md =null;
try {
md= MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md.update(password.getBytes());
byte[] mdbytes = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
我正在使用 Jboss 具有自定义领域的基于表单的身份验证,现在的问题是即使使用正确的密码也无法登录用户,每次都会重定向到错误页面。
我在 standalone.xml 的领地是
<security-domain name="testRealm" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/sbos"/>
<module-option name="principalsQuery" value="SELECT PASSWORD FROM USER WHERE NAME = ?"/>
<module-option name="hashAlgorithm" value="SHA-1"/>
<module-option name="hashEncoding" value="base64"/>
<module-option name="rolesQuery" value="SELECT 'Manager','Manager' FROM user WHERE name = ?"/>
</login-module>
</authentication>
</security-domain>
我建议您将审计元素添加到您的安全域,如下所示:
<audit>
<provider-module code="LogAuditProvider"/>
</audit>
然后在子系统日志记录下添加以下内容(如果还没有的话):
<periodic-rotating-file-handler name="AUDIT" autoflush="true">
<level name="TRACE"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="audit.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="org.jboss.security">
<level name="TRACE"/>
<handlers>
<handler name="AUDIT"/>
</handlers>
</logger>
然后您可以检查 audit.log 以了解有关您的错误的更多详细信息。
hashEncoding默认值为base64。你必须通过将 hashEncoding 更改为 hex 来解决这个问题,因为 SHA-1 使用十六进制编码。
<module-option name="hashAlgorithm" value="SHA-1"/>
<module-option name="hashEncoding" value="hex"/>