2016-06-10 43 views
0

我有以下情形:如何通過PyNaCl處理密碼管理?

在某些客戶端計算機上給出了Python應用程序,它啓用了多個用戶。它加密和解密用戶密碼。目前最推薦的方法是什麼?

由於PyNaCl用於通信加密和解密,使用PyNaCl的嘗試導致它不是一個好方法。這裏我們有密碼,應該被加密,存儲到文件中,然後根據請求解密(例如,如果特定用戶想重新登錄)。將密碼存儲在數據庫中對我們當前的實驗來說不是一種選擇(儘管它可能是更好的解決方案)。

根據你的經驗:解決這個加密和解密用戶數據問題的好方法是什麼?文本文件? (再次說明:這是實驗性的,並不意味着在當前階段的生產性使用)

+0

好點!它實際上是一個在多用戶支持的客戶端上運行的應用程序。 – Daniyal

回答

1

PyNaCl支持多種類型的密碼原語,但密碼哈希方案不是它們中的任何一種。

將加密用於密碼存儲是一種反模式。存儲的密鑰在哪裏解密加密的密碼?如果密鑰存儲在代碼中或文件系統中的某個文件中,那麼整個事情只不過是混淆。如果鑰匙丟失怎麼辦?攻擊者可以直接解密密碼並登錄。
我假設用戶實際上並不輸入密鑰,而是輸入密碼。如果他們鍵入密鑰,那麼這些密鑰可以直接用於PyNaCl加密。

相反,密碼應該反覆散列並存儲散列。如果用戶再次嘗試登錄,則密碼將再次使用相同的參數(salt,迭代次數,成本因子)進行散列,並與存儲的值進行比較。這是通常在客戶端 - 服務器應用程序中解決的問題,但不需要將密碼哈希存儲在任何地方,因爲PyNaCl的對稱加密還提供身份驗證(完整性)。這意味着您可以通過從中導出密鑰並嘗試解密容器來檢測錯誤的密碼。 PyNaCl產生錯誤(或容器被篡改)時密碼錯誤。

有多種方案(PBKDF2,bcrypt,scrypt,Argon2)可用於此目的,但它們都不包含在PyNaCl中。雖然,底層的libsodium支持其中兩個。

+0

謝謝你的回答!散列是一個有價值的提示。你會推薦python的哈希庫嗎?或者使用libsodium會完全夠用嗎? – Daniyal

+0

PyNaCl只是本地libsodium庫的一個包裝。你將不得不擴展它的API(並可能將它作爲GitHub上的pull請求提供)。我不能向你推薦任何圖書館。快速搜索出現[argon2](https://pypi.python.org/pypi/argon2)。 –

+0

將哈希與存儲的哈希進行比較不是最佳解決方案。更好的方法是對用戶輸入進行抽象並將其用作加密密鑰。 – Awn