Encryption
使用公鑰認證在 OpenPGP 中實現前向保密
我正在嘗試考慮實施加密文件共享系統的可行性,該系統既提供前向保密又允許公鑰驗證。我堅持這兩個要求之間的婚姻,希望有人可以幫助我。
為了提供前向保密,我認為應該為每個文件傳輸請求生成一個新的隨機密鑰對,而不是兩個使用者提前共享長期公鑰。這樣,如果特定文件共享的私鑰以某種方式被洩露,它只會洩露該文件,而不是該使用者發送的所有文件。
但是,為每個文件共享創建一個新的密鑰對會引入公鑰驗證問題。傳統上來說,公鑰的指紋應該親自驗證,並在密鑰對的整個生命週期內保持驗證。如果為每個文件共享生成一個新的密鑰對,那麼這意味著每個新的公鑰都需要親自驗證,這是不可行的。
是否可以為每個文件共享使用唯一的密鑰對來實現前向保密,同時還可以安全地驗證公鑰是否僅從正確的使用者發送一次?
請注意,該系統用於非同步文件傳輸,這意味著加密數據將暫時上傳到雲端,直到接收者下載。但是,文件共享請求將包含一個強製到期日期。
我將描述您擁有的兩個選項。可能還有更多我不知道的。
第一種是使用長期簽名密鑰來簽署公共 diffie-hellman 密鑰。將一堆這些上傳到雲端。然後,當有人想與您共享文件時,他們:
- 下載您的“下一個”簽名公共 diffie-hellman 密鑰
- 使用 OpenPGP 驗證簽名,如果失敗則中止
- 生成他們自己的新公共 diffie-hellman 密鑰
- 使用您的“下一個”密鑰生成共享密鑰(使用他們的私有 diffie-hellman 密鑰),用它加密文件(您實際上也可以為此使用 OpenPGP,這將是加密的對稱密鑰)
- 用他們的長期秘密簽署他們的新公共 diffie-hellman 密鑰(使用 OpenPGP)
- 上傳他們簽名的臨時公共 diffie-hellman 密鑰、描述他們使用的臨時公共密鑰的索引以及加密消息
- 刪除他們的新公共 diffie-hellman 密鑰等。
當您稍後來下載文件時,您:
- 下載他們在 #5 中上傳的所有內容
- 使用 OpenPGP 檢查數字簽名,如果失敗則中止
- 使用給定索引的臨時私鑰來計算共享密鑰
- 解密文件
- 刪除您的臨時私鑰、他們簽名的臨時公鑰等。
這基本上就是Open Whisper Systems對加密文本消息所做的事情。
您的另一個選擇是丟棄 OpenPGP 並執行A Forward-Secure Public-Key Encryption Scheme中描述並在此答案中討論的內容*。
*好的,這個答案確實提到了我的第一個建議,因為它是一個“微不足道(因此很糟糕)的解決方案”。我添加了更多細節和 Open Whisper Systems 的連結。既然 Open Whisper Systems 正在這樣做,它不會太糟糕,對吧?