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

PBKDF2 HMACSHA512在C#与Java中的哈希差异排查

C# PWDTK.NET与Java Spring Boot PBKDF2哈希不一致问题

搭档使用PWDTK.NET库对用户密码进行编码,现在计划将用户迁移至我的Spring Boot应用,需要保证密码编码逻辑一致,但我无法生成与C#端相同的哈希值。

测试数据

  • 明文密码:"123456"
  • 存储的Salt(Base64编码):"F2ZEAo/UMjzIJwNvCC6cRwObd4CX462BTv4Tn/ntaTad6P8Xej1VNqlwNdueYo/XklYPH2RDfLUjsa/dkqnQzg=="
  • 存储的哈希值(Base64编码):"hwuR4Ol/tVi9DxRsjAstLt+wfJsTMr+ZzOBh3X90pAmhZU2gyeOngE7OMbQuVB/VYjj+47IqtIYffJ9CHfV7TQ=="

C#端实现代码

public static HashedPassword GetNewPassword(string plainPassword)
{
    byte[] randomSalt = PWDTK.GetRandomSalt();
    byte[] hash = PWDTK.PasswordToHash(randomSalt, plainPassword);
    return new HashedPassword { PasswordHash = Convert.ToBase64String(hash), Salt = Convert.ToBase64String(randomSalt) };
}

Java(Spring Boot)端实现代码

public static boolean matches(String rawPassword, String storedHash, String storedSalt) throws NoSuchProviderException, UnsupportedEncodingException {

    byte[] decodedHash = Base64.getDecoder().decode(storedHash.getBytes());
    System.out.println("hash " + Hex.encodeHexString(decodedHash));

    byte[] decodedSalt = Base64.getDecoder().decode(storedSalt.getBytes());
    System.out.println("salt " + Hex.encodeHexString(decodedSalt));

    try {
        PBEKeySpec spec = new PBEKeySpec(rawPassword.toCharArray(), decodedSalt, 5000, 512);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        SecretKey generatedKey = factory.generateSecret(spec);
        byte[] generatedHash = generatedKey.getEncoded();
        System.out.println(Base64.getEncoder().encodeToString(generatedHash));
        return MessageDigest.isEqual(decodedHash, generatedHash);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        // Handle exceptions
        e.printStackTrace();
        return false;
    }
}

当前测试结果

我尝试多款在线PBKDF2工具,结果均与Java端一致。使用上述盐值、明文密码及5000次迭代,得到的哈希结果(十六进制)为:5281e548c33c0fece48967900b6af8dcfc66d7266fbede24be918192d3feb1437827e7c1c0b93c289abb805fbbfb76d66b512082f74b76061f5bd21d9d41d0ad,但与C#端存储的哈希值不匹配。

请问导致C#与Java端PBKDF2 HMACSHA512哈希不一致的原因可能是什么?

内容的提问来源于stack exchange,提问作者skrgahr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:20:06