【问题标题】:Storing the result of an SHA hash as a db.StringProperty() property将 SHA 哈希的结果存储为 db.StringProperty() 属性
【发布时间】:2011-12-26 17:36:06
【问题描述】:

我正在使用带有谷歌应用引擎的 python 2.7 创建一个小应用程序,并且我正在尝试存储类似于...的哈希值...

import hashlib  
def PassHash(self):  
     return   hashlib.sha256(
               hashlib.sha256(self.username).digest() + self.password
              ).hexdigest() + ''

这会返回一个十六进制字符串,然后我尝试将其存储在这样的类中:

class User(db.Model):
    UserName = db.StringProperty()
    Password = db.StringProperty(multiline = True)
    Email = db.EmailProperty()

    def Authenticate(self):
        UserList = User.gql("WHERE UserName = :username and Password = :password",  
                             username = self.UserName,  
                             password = self.PassHash())
        return UserList.count() == 1


    def Register(self):
        self.Password =  self.PassHash()
        print self.Password
        return db.put(self)

这适用于前几个测试用例,但之后我得到了这个异常:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 28: character maps to <undefined>

我怀疑问题可能出在 gql 查询中。我考虑过只使用 openid,但这对于了解一般情况下的操作很有用。我已经尝试了几种不同的散列函数变体,但都没有运气。我是否遗漏了一些关于可以存储在 StringProperty() 属性中的内容?

【问题讨论】:

    标签: python google-app-engine sha


    【解决方案1】:

    我会尝试不使用多行属性作为密码。我可以存储 sha 散列变量,如下所示:

    crypted_password = db.StringProperty()  
    salt = db.StringProperty() 
    
    def __encrypt(self, plaintext, salt=''):
        """returns the SHA1 hexdigest of a plaintext and salt"""
    
        phrase = hashlib.sha1()
        phrase.update('%s--%s' % (plaintext, salt))
        return phrase.hexdigest()
    
    def set_password(self, new_password):
        """sets the user's crypted_password"""
    
        import datetime
        if not self.salt:
            self.salt = self.__encrypt(str(datetime.datetime.now()))
        self.crypted_password = self.__encrypt(new_password, self.salt)
    

    【讨论】:

    • 我尝试了您的建议,但我也发现尝试对哈希的摘要进行哈希会导致问题。所以 return hashlib.sha256(hashlib.sha256(self.UserName).digest() + self.Password).hexdigest() 产生了错误,而 return hashlib.sha256(self.UserName + self.Password).hexdigest() 确实不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2014-08-19
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多