You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用bcrypt哈希密码存入MySQL时哈希值相同问题求助

问题根因

所有密码哈希值完全相同的问题由3个错误导致:

  • 盐值生成逻辑位置错误:salt = bcrypt.gensalt()写在模块全局作用域,仅在User.py首次被导入时执行1次,所有密码哈希都复用这同一个固定盐值,而种子数据里所有用户明文密码都是password123,相同明文+相同固定盐自然得到完全一致的哈希结果。
  • 验证方法缩进错误:validate_password方法定义在User类外部,SQLAlchemy无法将其识别为字段验证器,原本的密码哈希逻辑根本没有按预期绑定到password字段的赋值流程上。
  • 依赖缺失:代码开头没有导入bcrypt模块,正常运行会直接抛出导入错误。
修复方法

修改User.py代码,调整盐值生成位置、修正方法缩进、补全导入,修正后代码如下:

import bcrypt
from app.db import Base
from sqlalchemy.orm import validates
from sqlalchemy import Column, Integer, String


class User(Base):
  __tablename__ = 'users'
  id = Column(Integer, primary_key=True)
  username = Column(String(50), nullable=False)
  email = Column(String(50), nullable=False, unique=True)
  password = Column(String(200), nullable=False)

  @validates('email')
  def validate_email(self, key, email):
    # 校验邮箱格式必须包含@
    assert '@' in email
    return email

  @validates('password')
  def validate_password(self, key, password):
    assert len(password) > 4
    # 每次哈希密码时单独生成随机盐,禁止复用全局固定盐
    # 哈希结果转字符串方便存入数据库
    return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
验证

修正后重新执行seeds.py重建表并写入种子数据,此时即使所有用户的明文密码一致,数据库中存储的哈希值也会因为每个密码对应独立随机盐而完全不同,符合bcrypt的安全存储要求。

内容的提问来源于stack exchange,提问作者Supercowdude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:48:45