瀏覽代碼

漏洞修复-[中危] 密码使用MD5哈希

wjj 3 天之前
父節點
當前提交
ad13dad65c

+ 51 - 0
fs-common/src/main/java/com/fs/common/utils/PasswordUtils.java

@@ -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");
+    }
+}

+ 7 - 0
fs-service/src/main/resources/db/20260817-密码MD5升级BCrypt.sql

@@ -0,0 +1,7 @@
+-- ============================================================
+-- 密码哈希算法升级:MD5(32位) -> BCrypt(60位)
+-- 需先扩展 password 字段长度,否则 BCrypt 哈希无法写入。
+-- 执行前请确认实际字段长度,若已 >= 60 可跳过对应语句。
+-- ============================================================
+ALTER TABLE `fs_user` MODIFY COLUMN `password` VARCHAR(100) NULL DEFAULT NULL COMMENT '密码';
+ALTER TABLE `fs_doctor` MODIFY COLUMN `password` VARCHAR(100) NULL DEFAULT NULL COMMENT '密码';