更新时密码未加密

时间:2012-10-20 17:49:22

标签: python sqlalchemy pyramid

作为python的新手,我不太清楚为什么我会得到不一致的结果。 我注册了一个用户,我的表中的密码最终成为哈希版本。当用户更新其密码时,表中的密码最终为未散列的版本。显然,我想要哈希版本。我究竟做错了什么? (如果重要的话,我正在使用SQLAlchemy和mysql。)

我有以下内容:

def hash_password(password):
    blah, blah, blah # hash my password here
    return hashed_password

class User(Base):
    __tablename__ = 'mytable'
    email = Column('email')
    _password = Column('password')

    def _get_password(self):
        return self._password

    def _set_password(self, password):
        self._password = hash_password(password)
    password = property(_get_password, _set_password)
    password = synonym('_password', descriptor=password)

    def __init__(self, password="", email=""):
        self.email = email
        self.password = password
    @classmethod
    def register(cls, email, password):
        return DBSession.add(User(email=email,password=password)) # this correctly hashes the password

    @classmethod
    def update(cls, email, password):
        return DBSession.query(cls).filter(cls.email == email).update({'password': password}) #password ends up being the unhashed password

2 个答案:

答案 0 :(得分:5)

此处的问题是您通过User.update方法更新密码的方式。此方法完全跳过ORM并直接在数据库中更新行。很明显,当你这样做时,哈希密码的代码将不会运行。您粘贴的User模型很好,与我使用的相似。你需要使用它。这意味着要更新密码,您应该加载用户并设置密码。

user = DBSession.query(User).filter_by(email=email).first()
if user:
    user.password = new_password

以及稍后当事务被提交时,事情将是你期望的。

答案 1 :(得分:1)

您应该在数据库中存储密码哈希,因此模型的字段必须包含哈希值,而不是原始密码。要设置密码,您应该使用方法,使哈希和哈希设置为实例。要检查,如果密码正确,您应该散列用户定义的密码并将结果与​​存储在您的实例中的散列进行比较。哟将无法从哈希解码密码 - 这是不安全的。

class User(Base):
    __tablename__ = 'user'

    email = Column('email', String(80))
    password = Column('password', String(80))

    def set_password(raw_password):
        self.password = hash(raw_password)

    def check_password(raw_password):
        return self.password == hash(raw_password)