2008-10-17 54 views
0

我對加密函數的參數是一個字符串有點困惑。我應該簡單地用str()來包裝非字符串參數,例如加密函數的參數

hashlib.sha256(str(user_id)+str(expiry_time)) 
hmac.new(str(random.randbits(256))) 

(忽略random.randbits()可能不是密碼好的那一刻)。 編輯:我意識到hmac的例子很愚蠢,因爲我沒有在任何地方存儲密鑰!

回答

6

那麼,通常散列函數(和通常的密碼函數)在字節上工作。 Python字符串基本上是字節字符串。如果你想計算某個對象的散列,你必須將其轉換爲字符串表示。如果你想檢查散列是否正確,只要確保以後應用相同的操作。並確保您的字符串表示不包含您不想檢查的任何更改數據。

編輯:由於流行的請求一個簡短的提醒,Python unicode字符串不包含字節,但unicode代碼點。每個unicode代碼點包含多個字節(2或4,取決於Python解釋器的編譯方式)。 Python字符串只包含字節。所以Python字符串(類型str)是與字節數組最相​​似的類型。

+0

您可能想澄清'str'和'unicode'兩種Python字符串類型之間的區別。 – 2008-10-17 15:38:44

1

您可以。

但是,對於HMAC,您實際上想要將密鑰存儲在某處。沒有密鑰,以後就無法驗證散列值。 :-)

-1

哦和Sha256並不是一個真正的工業強度密碼功能(儘管不幸的是它在很多網站上都很常用)。這不是一個真正的方法來保護密碼或其他關鍵數據,但不足以產生時間標記

編輯:如上所述Sha256至少需要一些鹽。如果沒有鹽分,Sha256的字典攻擊(按時間)破解的障礙很低,並且還有很多彩虹表格可供使用。我個人不會使用比Blowfish更少的密碼(但那是因爲我偏執)

+0

你的意思是嗎?當然,如果你想用它來保護密碼,你應該添加一個salt,但是對於所有的散列函數都是如此。就個人而言,我認爲SHA-256與散列函數一樣具有行業實力。 – 2008-10-17 09:26:22