2011-12-26 62 views
0

我創建使用python 2.7與谷歌應用程序引擎小應用程序,我想存儲類似於哈希...存儲的SHA哈希作爲db.StringProperty()屬性

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

回答

0

我會嘗試沒有密碼的多行屬性。我可以存儲如下所示的哈希變量:

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) 
+0

我嘗試了您的建議,但我也發現嘗試散列哈希的摘要導致了問題。 所以 返回hashlib.sha256(hashlib.sha256(self.UserName).digest()+ self.Password).hexdigest() 產生的錯誤,而 返回hashlib.sha256(self.UserName + self.Password)。十六進制() 沒有。 – 2011-12-26 10:18:27