如何在嵌入式Tomcat中实现与digest.sh等效的密码哈希功能
嵌入式Tomcat 9 哈希密码生成解决方案
废弃RealmBase.digest()方法的替代实现
Tomcat 9 起官方废弃RealmBase.digest()后,等效的替代实现是org.apache.catalina.realm.MessageDigestCredentialHandler类,该类的哈希逻辑和digest.sh脚本、原RealmBase.digest()完全一致,支持所有digest.sh支持的算法、迭代次数、盐值配置,嵌入式Tomcat环境可直接调用,无需额外引入独立脚本。
具体使用方式
- 依赖说明:
MessageDigestCredentialHandler属于tomcat-embed-core内置类,常规嵌入式Tomcat项目已经包含该依赖,无需额外引入。 - 生成哈希密码代码示例:
import org.apache.catalina.realm.MessageDigestCredentialHandler; public class TomcatPasswordGenerator { public static String generateHashedPassword(String rawPassword, String algorithm, int iterations, int saltLength) { MessageDigestCredentialHandler credentialHandler = new MessageDigestCredentialHandler(); // 配置哈希算法,和digest.sh -a参数对应,支持SHA-256、MD5、BCrypt等所有Tomcat兼容算法 credentialHandler.setAlgorithm(algorithm); // 配置迭代次数,和digest.sh -i参数对应 credentialHandler.setIterations(iterations); // 配置盐值长度(单位:字节),和digest.sh -s参数对应,无盐需求可设为0 credentialHandler.setSaltLength(saltLength); // 生成的字符串可直接作为tomcat_users.xml中user标签的password属性值 return credentialHandler.mutate(rawPassword); } public static void main(String[] args) { // 示例:使用SHA-256算法,默认迭代次数、8字节盐值生成密码 String hashedPassword = generateHashedPassword("测试明文密码", "SHA-256", 10, 8); System.out.println("生成的哈希密码:" + hashedPassword); } }
- 密码校验方法:如果需要验证用户输入的明文密码是否匹配已存储的哈希值,可调用该类的
matches方法:
// 第一个参数为用户输入的明文密码,第二个参数为已存储的哈希密码 boolean isPasswordValid = credentialHandler.matches(userInputPlainPassword, storedHashedPassword);
提示:如果不需要自定义参数,直接使用无参数构造的
MessageDigestCredentialHandler即可,默认配置和digest.sh默认参数完全对齐,生成的哈希结果和直接调用digest.sh没有差异。
内容的提问来源于stack exchange,提问作者livesamarthgupta
相关产品推荐
相关产品推荐

