You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌入式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:24:01