Encryption

如何從短密碼中安全地生成非對稱密鑰對?

  • November 21, 2015

背景資訊:

我正計劃製作一個可以加密和上傳文件的文件主機。為了保護數據免受任何形式的黑客攻擊,我不想知道加密密鑰( $ K $ ) 用於文件,因此使用者必須進行非對稱加密 $ K $ 並發送它。這種雙重加密的原因是您仍然可以通過加密與其他帳戶共享(個人!)文件 $ K $ 也使用這些使用者的公鑰。

我的問題是:如果伺服器不保存/知道私鑰並且使用者不必記住 250 個十六進製字元的密碼,使用者如何獲得公鑰和私鑰?

問題:

有沒有辦法從密碼中導出密鑰對,就像 PBKDF-2 對對稱加密所做的那樣?

也歡迎以更簡單的方式重新安排加密步驟的建議。

或者:

也可以使用 PBKDF 應用的密碼加密私鑰並將其儲存在伺服器上,但我想保持“簡單”。;)

注意:此時我不在乎它是否需要 RSA、ECC 或晦澀的加密方案。

您可以期待的最好結果如下:

  1. 您將密碼導出為“足夠大”(例如 128 位)的密鑰 $ K $ 具有像PBKDF2這樣的密鑰派生函式。有一些細節需要注意(見下文)。
  2. 您使用密鑰 $ K $ 作為Pseudorandom Number Generator的種子。PRNG 是確定性的(相同的種子意味著相同的輸出序列)並產生隨機位。
  3. 您可以在密鑰對生成算法中將 PRNG 用於您想要使用的任何非對稱算法。對於基於離散對數的算法(如 DSA、ElGamal、Diffie-Hellman 及其橢圓曲線變體)而言,此步驟既便宜又簡單,前提是事先知道組參數(例如,它在您使用的所有相關軟體中都經過硬編碼)正在使用NIST定義的標準 P-256 橢圓曲線進行 ECDSA / ECDH )。對於 RSA,這不那麼便宜和簡單,因為密鑰生成過程需要生成隨機整數,直到達到素數。這仍然是可行的。

由於此過程是確定性的(對於給定的源密碼),您可以在每次需要私鑰時再次執行它。


現在密碼的問題在於它們來自“適合普通使用者的想法”的相對較小且不統一的空間。它們容易受到詳盡搜尋的影響,對於密碼,傳統上稱為字典攻擊。解決這個問題的通用方法有以下三種:

  • 不要讓攻擊者學習任何允許他驗證密碼猜測的數據。在通常將密碼雜湊儲存在伺服器中以進行使用者身份驗證的情況下,這意味著您不希望攻擊者能夠讀取數據庫;這就是15 年前類 Unix 系統切換到影子密碼的原因。您仍然希望儲存散列密碼,並使用其他兩種保護措施,因為在現實世界中確實會發生非法只讀訪問。
  • 使用可配置的慢速密鑰派生函式。這使得字典攻擊成比例地變慢了——但正常使用也變慢了,同樣的因素。這就是為什麼 PBKDF2 或bcrypt等 KDF包含迭代計數的原因。您希望將該計數提高到您的使用者仍然可以容忍的最高值。
  • 使用來防止攻擊並行。並行性是關於攻擊N個密碼(不一定同時),其成本低於攻擊一個密碼的N倍(預先計算的表是一種並行性)。salt 是一個公共數據,它充當 KDF 的變體;這相當於說有許多不同的 KDF,salt 說你使用哪一個。

在您的場景中,您沒有第一個保護:生成的公鑰本質上是公開的,因此可以用於離線字典攻擊。攻擊者只需嘗試可能的密碼,直到找到相同的公鑰。這是您想要實現的目標所固有的。

第三種保護(鹽)也可能很困難。鹽不需要保密,但它仍然必須具有一定程度的完整性。無論鹽儲存在哪裡,想要重新計算其私鑰的使用者必須合理地確保他使用了正確的鹽(否則他將計算錯誤的私鑰)。根據使用場景,擁有這樣的儲存空間可能容易,也可能不容易。一個部分的解決方案是使用使用者名作為鹽(推測,使用者將能夠記住自己的名字);隨著鹽的發展,使用者名不太理想,因為:

  • 兩個不同伺服器安裝(使用相同軟體)上的兩個使用者可能具有相同的名稱;
  • 當使用者更改他的密碼時,他不會更改他的名字;

這打破了鹽試圖實現的“單一性”屬性。儘管如此,使用鹽作為使用者名總比沒有鹽好得多(更好的是,使用使用者的電子郵件地址作為鹽:使用者記住他們自己的地址,而電子郵件地址本質上是全球唯一的)。如果您根本不使用任何鹽,那麼同一系統上的兩個不同使用者碰巧選擇了相同的密碼,最終將使用相同的密鑰對,只需列出公鑰就會立即顯示出來。


**注意:**從密碼中推導出私鑰意味著當使用者更改密碼時,他也更改了他的私鑰。很有可能這是一個問題。這就是為什麼您可能更喜歡間接系統的原因之一,其中完全正常的密鑰對儲存在某處,並使用密碼派生密鑰進行對稱加密。因此,當密碼更改時,您只需用舊密碼解密密鑰,然後用新密碼再次加密。但這需要一個可用的儲存區域。該模型直接由例如GnuPG支持。

引用自:https://crypto.stackexchange.com/questions/1662