2015-03-13 154 views
1

我想知道是否有這樣的協議。遠程存儲密碼保護私鑰

這個想法是在服務器上有一些加密的數據。

現在我想找到滿足以下要求的協議。

  1. 由於積極的密鑰管理是超出了大多數用戶願意忍受,密碼保護的密鑰存儲在服務器上。

  2. 服務器應該無法解密數據。即無法學習密碼

  3. 第三方不應該能夠訪問密碼保護密鑰,因爲他們不知道密碼。

  4. 應該只有一個密碼。用2個密碼解決這個問題是微不足道的。一個下載受保護的密鑰,一個解密密鑰

該解決方案可能涉及某種知識密碼的零知識證明。

+0

我想一個解決方案將哈希密碼與兩個不同的鹽值,並使用一個檢索密鑰和一個解除它。雖然我不確定這是多麼的健全。是否有像這樣的標準/參考實現。 – yokto 2015-03-13 13:56:35

回答

2

使用相同的密碼生成多個密鑰和身份驗證哈希沒有任何問題。無論如何,您都不應該將真正的密碼發送到服務器。你想先通過PBKDF2發送它。我的認證通常的建議是這樣的:

salt = static-per-app-token + username 
key = PBKDF2(salt, password, > 10000 iterations) 
send key to server 
on server: finalkey = SHA512(key) // This step keeps someone who steals your auth database from logging in 
compare finalkey to database 

鑑於該程序,你可以修改PBKDF2一步的兩倍,只要你需要生成一個密鑰。頂部的X字節用於驗證,底部的X字節用於解密。 PKBDF2可以根據需要創建任意數量的字節,並且只有一半的字節不能幫助您找出另一半。

對於您的特定問題,這可能是最方便和最好的表現。您也可以按照您的建議進行,併爲PBKDF2使用兩種不同的鹽。這也很好。計算需要兩倍的時間。如果這不是問題,那麼這是一個非常簡單的解決方案,根據您的代碼可能會更方便。

但是我們只是想討論另一個步驟,假設您沒有密碼。你有一個(隨機)鍵,並且你想從中創建獨立的鍵。或者你已經有了PBKDF2的輸出,並且想把它擴展到更多的鍵。在這種情況下,您可以使用HKDF來擴展密鑰。這個過程很簡單(||手段「串連」):

prk = psuedorandom key (your input key) 
info = some-random-token || username 
T(0) = empty string (zero length) 
T(1) = HMAC-Hash(PRK, T(0) | info | 0x01) 
T(2) = HMAC-Hash(PRK, T(1) | info | 0x02) 
T(3) = HMAC-Hash(PRK, T(2) | info | 0x03) ... 

您繼續建立T(n)的,直到你有你所有的按鍵足夠的字節。您將所有T(n)結果粘合在一起,並將其切片以將您的密鑰取出。這比PBKDF2快得多,並且可以應用於PBKDF2的輸出。

查看RNCryptor v4 spec,瞭解將單個密碼擴展爲一堆不同密鑰和隨機值的過程示例。

密碼仍然很糟糕,而且這些都不能修復嚴重選擇的密碼,但如果密碼合理難以猜測,那麼至少會將卡片堆疊在您的偏好之內。