Хранение результата хэша SHA в виде свойства db.StringProperty () - PullRequest
0 голосов
/ 26 декабря 2011

Я создаю небольшое приложение, используя python 2.7, с движком приложений Google и пытаюсь сохранить хеш, похожий на ...

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 ()?

1 Ответ

0 голосов
/ 26 декабря 2011

Я бы попробовал без многострочного атрибута для пароля.Я мог бы хранить хэшированные переменные ша, как показано ниже:

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)
...