如何生成与Jira数据库存储一致的用户密码哈希值?
Jira密码哈希匹配相关问题解答
Jira使用的密码哈希具体算法
Jira的密码哈希算法随版本迭代有差异,不同版本的默认算法如下:
- Jira 6.0及以上版本默认使用
PBKDF2WithHmacSHA1,数据库中存储的credential字段标识为{PKCS5S2} - Jira 7.13及以上版本新增可选算法
PBKDF2WithHmacSHA256、BCrypt,对应标识分别为{PBKDF2WithHmacSHA256}、{bcrypt} - Jira 6.0之前的旧版本使用标准SHA1算法,存储标识为
{SHA}
数据库中存储的完整哈希串格式为:{算法标识}${迭代次数}${盐Base64编码}${哈希结果Base64编码},各段以$作为分隔符。
是否可以生成完全匹配的哈希
可以生成完全匹配的哈希,生成失败几乎都是参数未对齐导致的,只要拿到对应账号的明文密码、数据库中存储的对应盐、迭代次数、算法类型四个参数完全一致,即可生成100%匹配的哈希值。
具体操作步骤
- 第一步:从Jira数据库
cwd_user表对应账号的credential字段取出完整哈希串,拆分出四个核心参数:算法标识、迭代次数、盐Base64串、原始哈希Base64串 - 第二步:参数校验对齐:迭代次数必须和拆分结果完全一致,盐必须直接使用拆分出的Base64串解码,不要自行生成新盐,明文密码要完全匹配原始密码的大小写、特殊字符,无多余空格
- 第三步:按对应算法执行哈希计算,以下为PBKDF2WithHmacSHA1算法的Java参考实现:
import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import java.util.Base64; public class JiraHashGenerator { public static void main(String[] args) throws Exception { // 替换为实际参数 String plainPassword = "用户原始明文密码"; int iterationCount = 10000; String saltBase64 = "拆分得到的盐Base64串"; byte[] salt = Base64.getDecoder().decode(saltBase64); PBEKeySpec spec = new PBEKeySpec(plainPassword.toCharArray(), salt, iterationCount, 160); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); byte[] hashBytes = factory.generateSecret(spec).getEncoded(); String generatedHash = Base64.getEncoder().encodeToString(hashBytes); // 输出的generatedHash和拆分得到的原始哈希Base64串对比即可 System.out.println(generatedHash); } }
- 如果算法标识为
{bcrypt},直接使用标准BCrypt算法,代入拆分得到的成本因子和盐计算即可 - 如果算法标识为
{SHA},直接计算明文密码的标准SHA1值,再做Base64编码即可匹配
内容的提问来源于stack exchange,提问作者ouadhi mohammed
相关产品推荐
相关产品推荐

