公開其使用者發送的所有加密消息的服務。這些數據將受到怎樣的保護?
我最近開始了一個帶有端到端加密的開源消息傳遞系統的新項目。
我對這個項目的主要想法是,一切都應該盡可能透明,伺服器只是一個中介 - 任何人都可以訪問但只能由他們的預期接收者解密的加密消息的儲存庫,他們將保密密鑰在本地安全。
我選擇的加密是 PGP,因為我知道沒有已知的攻擊可以破解它;它可以防止明文及其加密版本都已知的攻擊,並且使用初始化向量可以確保相同內容的兩個實例不會產生相同的加密輸出。
但是,允許每個人訪問所有加密消息似乎是有風險的,因為:
- 暫時沒有已知的攻擊,但未來可能會改變
- 使用目前的硬體進行暴力破解需要很長時間,但硬體只會改進
- 量子電腦可能會成為未來的東西
我真的不希望伺服器處理身份驗證和會話,因為我想將其視為使用者無法真正信任的東西(最近的歷史表明,伺服器是否會受到損害通常只是時間和利益問題)。我還想為使用者提供更多的匿名性和隱私性——如果伺服器不知道使用者的真實身份(因為它不知道他們是否可以解密他們訪問的消息),那麼攻擊者就可以控制它並且監控它的連接也不能,至少不能肯定。
我的問題是,允許每個人訪問所有消息是否合理?我提到的關於可能發生的攻擊的觀點是否合理?對於消息最終被破解的可能性,這種改進的“隱私和匿名性”真的不是一個很好的權衡嗎?
回答您的主要問題:讓每個人都可以訪問加密消息可能會帶來安全風險。消息傳遞系統通常是非同步的(意味著您可以向目前離線的人發送消息),這使得提供完美的前向保密非常困難(很棒的文章 TextSecure 如何在此處解決此問題)。因此,具有強大儲存能力的攻擊者(例如在猶他州擁有一個巨大的數據中心)可以簡單地收集流經您的伺服器的所有消息並儲存它們。每當使用者的 PGP 私鑰被洩露時,攻擊者可以簡單地返回記錄的消息並解密使用者收到的所有消息。
但是,您還提到您正在假設一個可以危害伺服器本身的對手。在這種情況下,是否每個使用者都可以訪問所有消息並不重要。我認為首先了解您的消息傳遞系統的目標以及您想要使用的不同安全建構塊很重要。
安全目標
- 接收者匿名:通過使伺服器成為加密消息的公共儲存庫,您基本上是在創建一個廣播通道,每個人都可以在其中接收消息,但只有預期的接收者可以解密它。圍繞接收者匿名存在大量研究(例如,這),但我不確定這是否真的是建構系統的正確方法。任何一種廣播通道解決方案都存在的問題是,每一方都必須嘗試解密每條消息,這不能很好地擴展(具有諷刺意味的是,接收者的匿名性隨著系統中參與者的數量而增加)。因此,無論從加密的角度來看,將加密消息暴露給所有參與者是否會帶來安全風險,出於性能原因,我都不建議將這種方法用於消息傳遞系統。
- 隱私:使用 PGP 確實會為您的消息提供機密性。但是,它還要求您的消息傳遞系統的參與者擁有一個真實的通道來檢索彼此的公鑰。這不可能是伺服器本身,因為您假設存在潛在的惡意/受損伺服器設置。對於這個問題,Threema 想到了一個很好的解決方法,伺服器分發公鑰,但使用者可以通過帶外方法(電話、掃描 QR 碼……)驗證密鑰的指紋。即使惡意伺服器會用自己的公鑰替換接收者的公鑰,發送者也可以通過驗證指紋來發現這一點。
現有的建構塊
- 混合:您可以在此處閱讀有關混合網路的資訊。您基本上實現了被動攻擊者可以了解所有發送者和接收者的身份,但不能將它們連結在一起。這與您的設置中的匿名級別相同,因為惡意伺服器知道誰在連接,但不知道誰可以讀取哪些消息。
實施建議
看看 XMPP/Jabber。該協議存在很大的擴展,可提供端到端加密甚至 OTR 消息傳遞。