Flask密码安全 #

一、密码安全原则 #

1.1 安全原则 #

原则 说明
不存储明文 密码必须哈希存储
使用强哈希 使用bcrypt、PBKDF2等
加盐处理 每个密码使用不同盐值
慢哈希 增加计算成本

二、Werkzeug密码哈希 #

2.1 生成密码哈希 #

python
from werkzeug.security import generate_password_hash

password_hash = generate_password_hash('password')
# 默认使用pbkdf2:sha256

password_hash = generate_password_hash('password', method='pbkdf2:sha256', salt_length=16)

2.2 验证密码 #

python
from werkzeug.security import check_password_hash

is_valid = check_password_hash(password_hash, 'password')

三、用户模型集成 #

3.1 密码属性 #

python
from werkzeug.security import generate_password_hash, check_password_hash

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))
    password_hash = db.Column(db.String(128))
    
    @property
    def password(self):
        raise AttributeError('password is not readable')
    
    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)
    
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

3.2 使用示例 #

python
# 设置密码
user = User(username='zhangsan')
user.password = 'secret123'
db.session.add(user)
db.session.commit()

# 验证密码
if user.check_password('secret123'):
    print('密码正确')

四、使用Bcrypt #

4.1 安装 #

bash
pip install flask-bcrypt

4.2 使用 #

python
from flask_bcrypt import Bcrypt

bcrypt = Bcrypt(app)

# 生成哈希
password_hash = bcrypt.generate_password_hash('password').decode('utf-8')

# 验证密码
is_valid = bcrypt.check_password_hash(password_hash, 'password')

五、最佳实践 #

5.1 密码强度验证 #

python
import re

def validate_password_strength(password):
    if len(password) < 8:
        return False, '密码至少8个字符'
    if not re.search(r'[A-Z]', password):
        return False, '密码需要包含大写字母'
    if not re.search(r'[a-z]', password):
        return False, '密码需要包含小写字母'
    if not re.search(r'\d', password):
        return False, '密码需要包含数字'
    return True, ''

5.2 密码重置 #

python
import secrets
from datetime import datetime, timedelta

class PasswordReset(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    token = db.Column(db.String(100), unique=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    expires_at = db.Column(db.DateTime)

def create_reset_token(user):
    token = secrets.token_urlsafe(32)
    reset = PasswordReset(
        user_id=user.id,
        token=token,
        expires_at=datetime.utcnow() + timedelta(hours=1)
    )
    db.session.add(reset)
    db.session.commit()
    return token

六、下一步 #

接下来让我们学习 用户角色与权限,了解权限控制!

最后更新:2026-03-28