tomcat 默认使用的安全域是从 conf/tomcat-users.xml 文件中读取用户名、密码和角色信息的,在默认的情况下密码是明文显示的,安全性不够,tomcat支持使用 md5 sha 等算法对密码进行加密。
1.设置安全域加密算法
在server.xml文件中,找到 Realm 的配置,在最里层的 Realm (一般默认是UserDatabaseRealm)添加标签:
上面的标签表示,使用的凭证处理器为 MessageDigestCredentialHandler,tomcat还支持其它的凭证处理器如SecretKeyCredentialHandler,上面的标签配置了使用摘要算法 MD5 来加密密码,它的作用是会对用户输入的密码进行 MD5 摘要以后再和tomcat-users.xml中存储的用户密码进行比对。
2.加密tomcat-users.xml文件中的密码
由于上面第一步设置了使用 MD5 加密算法,所以存储的密码必需是 MD5 摘要后的,tomcat提供了加密脚本,可以方本地将自己的密码按照指定的算法加密,
该加密脚本是 bin/digest.bat (windows)和 bin/digest.bat (Linux),示例如下:
conquer@l:~/Desktop/temp/tomcat-7.0.30/bin$ sh digest.sh -a md5 tomcattomcat:1b359d8753858b55befa0441067aaed3 上述示例将 tomcat 按照 md5 加密后的产生了密文的密码,将其填写到 tomcat-users.xml里,如下所示: 好了,这样别人再打开你的 tomcat-users.xml也看不到你的密码了,通过浏览器照常输入 tomcat 密码,后台验证一样通过。
后记:当然,这样的密码只是简单的一次 MD5 摘要,很容易暴力破解,例如通过 http://www.cmd5.com/ 这个网站,输入1b359d8753858b55befa0441067aaed3很轻松得到“tomcat”明文密码,Tomcat 也考虑到这个问题,也提供了 加盐摘要的方式。
tomcat 的 org.apache.catalina.realm.RealmBase 类的 main 方法,可以使我们方便地计算加盐摘要,可以指定加盐的字节长度,可以指定循环加密次数,示例代码:
public static void main(String[] args) throws Exception { String[] arr = {"-a","md5","-s","32","-i","3","tomcat"}; org.apache.catalina.realm.RealmBase.main(arr); } 上述示例 -s 参数 指定 加盐的字节长度为32, -i 参数指定了循环加密的次数为3,打印出结果: tomcat:0cc63656bcc70900b645242bcc84119a8766eed1c1d8b85fd1c44d6dd39dd330$3$982cff910b4d918a1450fb3e8810dc86 可以看到,tomcat字符串本次加密使用的32位随机盐值字节转换为16进制字符串为:0cc63656bcc70900b645242bcc84119a8766eed1c1d8b85fd1c44d6dd39dd330循环加密次数为:3
加密后的结果为:982cff910b4d918a1450fb3e8810dc86
好了,这样的结果就不会那么轻易地被暴力破解了!!!