增强后台登录安全与密码策略
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
import base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import re
|
||||
import secrets
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
@@ -24,6 +25,19 @@ class AdminAccountDBOperator(BaseDBOperator):
|
||||
HASH_SCHEME = "pbkdf2_sha256"
|
||||
# PBKDF2 迭代次数:在安全性与计算开销之间做平衡。
|
||||
HASH_ITERATIONS = 150_000
|
||||
# 风险口令清单:
|
||||
# 1. 这里优先覆盖系统默认口令和常见极弱口令;
|
||||
# 2. 后台安全判断只需要识别“明显危险”的情况,不追求做成完整密码字典;
|
||||
# 3. 统一放在数据层,便于登录鉴权、修改密码、首登提醒共用。
|
||||
RISKY_PASSWORDS = {
|
||||
"admin",
|
||||
"admin123",
|
||||
"123456",
|
||||
"12345678",
|
||||
"password",
|
||||
"qwerty",
|
||||
"abot123",
|
||||
}
|
||||
|
||||
def init_tables(self) -> bool:
|
||||
"""初始化后台管理员表。
|
||||
@@ -120,6 +134,44 @@ class AdminAccountDBOperator(BaseDBOperator):
|
||||
(password_hash, str(username or "").strip()),
|
||||
)
|
||||
|
||||
def is_using_risky_password(self, username: str) -> bool:
|
||||
"""判断指定管理员是否仍在使用风险口令。"""
|
||||
row = self.get_admin_by_username(username)
|
||||
if not row:
|
||||
return False
|
||||
stored_hash = str(row.get("password_hash") or "")
|
||||
if not stored_hash:
|
||||
return False
|
||||
|
||||
# 口令是哈希存储的,因此只能把风险候选集逐个比对。
|
||||
for candidate in self.RISKY_PASSWORDS:
|
||||
if self.verify_password(candidate, stored_hash):
|
||||
return True
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def validate_password_strength(cls, raw_password: str) -> Optional[str]:
|
||||
"""校验密码强度,返回错误提示;通过时返回 None。"""
|
||||
password_text = str(raw_password or "")
|
||||
if len(password_text) < 8:
|
||||
return "新密码长度不能少于8位"
|
||||
|
||||
if password_text.lower() in cls.RISKY_PASSWORDS:
|
||||
return "新密码过于简单,请避免使用默认口令或常见弱口令"
|
||||
|
||||
score = 0
|
||||
if re.search(r"[A-Za-z]", password_text):
|
||||
score += 1
|
||||
if re.search(r"\d", password_text):
|
||||
score += 1
|
||||
if re.search(r"[^A-Za-z0-9]", password_text):
|
||||
score += 1
|
||||
|
||||
# 至少满足两类字符,既兼顾安全性,也避免把规则设得过于苛刻。
|
||||
if score < 2:
|
||||
return "新密码需至少包含字母、数字、符号中的两类"
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def hash_password(cls, raw_password: str) -> str:
|
||||
"""生成口令哈希。
|
||||
@@ -163,4 +215,3 @@ class AdminAccountDBOperator(BaseDBOperator):
|
||||
return hmac.compare_digest(actual_digest, expected_digest)
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
Reference in New Issue
Block a user