Class PasswordUtils

java.lang.Object
tech.riemann.nif.auth.encode.PasswordUtils

public class PasswordUtils extends Object
密码加密工具类

默认 encode(String) 使用 PBKDF2WithHmacSHA256(随机盐 + 可配置迭代次数,默认 10 万次), match(String, String) 自动识别密码格式:

  • PBKDF2 格式(Base64 编码,64 字符)→ PBKDF2 验证
  • 旧版 MD5 随机盐格式(48 字符)→ MD5 验证(渐进迁移兼容,老密码仍可登录)
迁移策略:新密码使用 PBKDF2 加密;老 MD5 密码验证通过后,可配合 PasswordMatcher.needsRehash(String) 判断并重哈希升级。
Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Details

    • PasswordUtils

      public PasswordUtils()
  • Method Details

    • encode

      public static String encode(String algorithm, String password, String salt, int iterations)
      加盐迭代多次摘要
      Parameters:
      algorithm - 摘要算法
      password - 明文密码
      salt - 加密盐
      iterations - 迭代次数
      Returns:
      密文
    • encode

      @Deprecated(since="4.2.0") public static String encode(String password, String salt)
      Deprecated.
      4.2.0 起使用 encodeByPBKDF2(String) 替代
      MD5固定盐多次摘要
      Parameters:
      password - 明文密码
      salt - 加密盐
      Returns:
      密文
    • encodeByPBKDF2

      public static String encodeByPBKDF2(String password)
    • encodeByPBKDF2

      public static String encodeByPBKDF2(String password, int iterations)
      PBKDF2 加密(指定迭代次数,供配置化使用)
      Parameters:
      password - 明文密码
      iterations - PBKDF2 迭代次数
      Returns:
      Base64(盐||哈希)
    • check

      @Deprecated(since="4.2.0") public static boolean check(String rawPassword, String salt, String password)
      Deprecated.
      4.2.0 起使用 matchesByPBKDF2(String, String) 替代
      MD5固定盐密码匹配
      Parameters:
      rawPassword - 明文密码
      salt - 盐
      password - 密文
      Returns:
      是否匹配
    • matchesByPBKDF2

      public static boolean matchesByPBKDF2(String rawPassword, String encodedPassword)
    • matchesByPBKDF2

      public static boolean matchesByPBKDF2(String rawPassword, String encodedPassword, int iterations)
      PBKDF2 验证(指定迭代次数,供配置化使用)

      常量时间比较(MessageDigest.isEqual),防止时序攻击

      Parameters:
      rawPassword - 明文密码
      encodedPassword - Base64(盐||哈希)
      iterations - PBKDF2 迭代次数(必须与加密时一致)
      Returns:
      是否匹配
    • isPBKDF2Format

      public static boolean isPBKDF2Format(String encoded)
      判断是否为 PBKDF2 格式

      PBKDF2 格式特征:Base64(16字节盐 + 32字节哈希) = 48 字节 = 64 字符

      Parameters:
      encoded - 加密后的密码
      Returns:
      true 表示 PBKDF2 格式
    • randomSaltEncode

      public static String randomSaltEncode(String password)
      MD5随机盐摘要
      Parameters:
      password - 明文
      Returns:
      摘要
    • randomSaltEncode

      public static String randomSaltEncode(String password, int iterations)
      MD5随机盐摘要
      Parameters:
      password - 明文
      iterations - 迭代次数
      Returns:
      摘要
    • randomSaltVerify

      public static boolean randomSaltVerify(String password, String md5)
      MD5随机盐摘要验证
      Parameters:
      password - 明文
      md5 - 密文
      Returns:
      是否匹配
    • randomSaltVerify

      public static boolean randomSaltVerify(String password, String md5, int iterations)
      MD5随机盐摘要验证
      Parameters:
      password - 明文
      md5 - 摘要
      iterations - 迭代次数
      Returns:
      是否匹配
    • encode

      public static String encode(String password)
      加密(默认 PBKDF2WithHmacSHA256,随机盐 + 10 万次迭代)
      Parameters:
      password - 明文密码
      Returns:
      PBKDF2 密文(Base64,64 字符)
    • match

      public static boolean match(String rawPassword, String encodedPassword)
      验证密码(自动识别格式,默认迭代次数)

      PBKDF2 格式 → PBKDF2 验证;旧版 MD5 随机盐格式(48 字符)→ MD5 验证(渐进迁移兼容)

      Parameters:
      rawPassword - 明文密码
      encodedPassword - 加密密码
      Returns:
      是否匹配
    • match

      public static boolean match(String rawPassword, String encodedPassword, int iterations)
      验证密码(自动识别格式,指定 PBKDF2 迭代次数)
      Parameters:
      rawPassword - 明文密码
      encodedPassword - 加密密码
      iterations - PBKDF2 迭代次数(与加密时一致)
      Returns:
      是否匹配