|
|
@@ -0,0 +1,51 @@
|
|
|
+package com.fs.common.utils;
|
|
|
+
|
|
|
+import com.fs.common.utils.sign.Md5Utils;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 密码哈希工具类
|
|
|
+ *
|
|
|
+ * 新密码统一使用 BCrypt 哈希;校验时兼容历史 MD5 哈希,登录成功后可通过
|
|
|
+ * {@link #isLegacy(String)} 判断是否需要升级,将旧 MD5 平滑迁移为 BCrypt。
|
|
|
+ *
|
|
|
+ * @author fs
|
|
|
+ */
|
|
|
+public class PasswordUtils {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成密码哈希(BCrypt)
|
|
|
+ *
|
|
|
+ * @param rawPassword 明文密码
|
|
|
+ * @return BCrypt 哈希
|
|
|
+ */
|
|
|
+ public static String encode(String rawPassword) {
|
|
|
+ return SecurityUtils.encryptPassword(rawPassword);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验密码,兼容 BCrypt 与历史 MD5 哈希
|
|
|
+ *
|
|
|
+ * @param rawPassword 明文密码
|
|
|
+ * @param storedPassword 数据库中存储的密码哈希
|
|
|
+ * @return 是否匹配
|
|
|
+ */
|
|
|
+ public static boolean matches(String rawPassword, String storedPassword) {
|
|
|
+ if (rawPassword == null || storedPassword == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (storedPassword.startsWith("$2")) {
|
|
|
+ return SecurityUtils.matchesPassword(rawPassword, storedPassword);
|
|
|
+ }
|
|
|
+ return Md5Utils.hash(rawPassword).equals(storedPassword);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否为历史 MD5 哈希(需要升级为 BCrypt)
|
|
|
+ *
|
|
|
+ * @param storedPassword 数据库中存储的密码哈希
|
|
|
+ * @return true 表示为历史 MD5 哈希
|
|
|
+ */
|
|
|
+ public static boolean isLegacy(String storedPassword) {
|
|
|
+ return storedPassword != null && !storedPassword.startsWith("$2");
|
|
|
+ }
|
|
|
+}
|