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