Public-Key

在 Web 應用程序中在何處以及如何儲存私鑰以使用 Web 瀏覽器進行私人消息傳遞

  • October 17, 2019

我正在開發一個 Web 應用程序,使使用者能夠通過私人消息進行通信,這只是整個系統的一部分。我在開發過程中的主要重點是保護使用者的隱私,我認為這應該是每個軟體開發人員的主要職責之一。尤其是當您考慮過去幾年的有害數據洩漏時。

我已經閱讀了很多關於端到端加密的文章,以及諸如 Whatsapp 之類的著名消息傳遞應用程序使用端到端加密來保護其使用者隱私。我想實現我的伺服器和我的應用程序對正在傳輸的消息內容的了解為零。

當您在使用者設備上安裝了應用程序時,我理論上知道如何在使用者設備上儲存和保護私鑰。但在我的特殊情況下,使用者設備上不會安裝任何執行檔。他們通過瀏覽器和安全的 https 連接訪問 Web 應用程序。這個事實讓我很頭疼。我什至無法想像如何在這個客戶端環境中永久且安全地儲存私鑰。所以我考慮以安全的方式將密鑰儲存在伺服器上,但這與我的想法是矛盾的,當考慮到我必須假設潛在的對手接管了我的伺服器、數據庫的控制…整個機器,而一切都在執行並且“密鑰庫未密封”。

幾天前我在 StackOverflow 上提出了一個問題,如果你想了解更多關於我的絕望之路。保護應用程序機密,例如加密密鑰和其他敏感數據。經過長時間的討論,我被推薦到 StackExchange 的這個密碼學論壇。

所以我想問你而不關注任何特殊的程式語言:“在哪里以及如何在網路應用程序中儲存私鑰,以便與網路瀏覽器進行私人消息傳遞?”。提前致謝!

您可能需要考慮在 Web 瀏覽器中使用Web Cryptography API進行客戶端加密。然後,您可以使用 webcrypto api 創建一個密鑰對,並使用索引數據庫儲存儲存包含使用者私鑰的CryptoKey 對象,並將 .extractable 屬性設置為 false 。這樣,私鑰只能用於在瀏覽器中解密和/或簽署消息 - 但無法讀取(即使通過瀏覽器中的客戶端腳本)。

有關詳細資訊,請參閱:

參考我提供的問題:“在哪里以及如何在 Web 應用程序中儲存私鑰,以便與 Web 瀏覽器進行私人消息傳遞?” 這意味著我想找到一種防彈機制來永久儲存和保護網路瀏覽器中的公鑰,以進行端到端加密消息傳遞,而無需更多:

  • 網頁瀏覽器
  • HTTPS 支持
  • javascript
  • 瀏覽器中的永久儲存

我不得不遺憾地接受,我的問題沒有答案(這是完全安全的)。

我想通過提供評論部分討論的摘要來證明這一說法的合理性,並參考一些外部資源來鞏固目標環境中的弱點。

  1. 在 Cookie 中儲存私鑰- 這種方法非常簡單,但也涉及一些安全問題。首先,如果“請求的 URL 在 cookie 中定義的同一域和路徑內”,則在每個 http 請求中發送一個 cookie - Stackoverflow這意味著私鑰隨著使用者的每個 http 請求傳輸到伺服器擁有私鑰。客戶端-伺服器通信通過 HTTPS 受到保護,但如果伺服器受到威脅,則私鑰會洩露。與在 cookie 中儲存秘密相關的下一個問題是,如果 cookie 過期或通過瀏覽器設置或使用者自己刪除,那麼私鑰將永遠失去。

加密的私鑰儲存在 cookie 中,並將該加密的私鑰備份到安全的客戶端數據儲存設備上怎麼樣?

嗯,這是一個選擇。讓我們假設使用者可以使用 AES 和使用者腦海中記住的強密碼來加密私鑰。然後,即使 cookie 通過安全線路傳輸到執行受感染應用程序的伺服器,攻擊者也無法使用加密密鑰完成任何操作。如果 cookie 過期或從瀏覽器中刪除,使用者可以通過他的外部備份來恢復它。在撰寫本文時,我們可以認為我們已經解決了問題。我會告訴你我們很遺憾沒有,但在我給你提供一個生動的例子之前,我在研究期間在一個網站上發現(但不幸的是我失去了 URI),為什麼即使加密也傳輸私鑰和越過安全線根本不合理。想像一下,您製作了一些非常私密的照片,您使用強密碼和安全加密機制對這些照片進行了加密,任何人都可以在接下來的數百萬年內解密這些照片,但您不會將這些加密文件發送到您的朋友,因為您會對您的一位朋友解密您的照片的風險感到不安。您還應該對將這些加密的私鑰傳輸到伺服器感到不自在。

  1. 客戶端 javascript 加密- 在撰寫此答案時,有不同的 javascript 加密庫,其中最先進的庫之一是*“Stanford Javascript Crypto Library (SJCL)”*,可用於加密數據,在我們的例子中,私鑰。使用 javascript 進行客戶端加密的問題在於,攻擊者可以通過受感染的伺服器或跨端腳本攻擊注入惡意 javascript 程式碼。您不能簽署您的 javascript 文件(至少不符合系統要求的問題),並且您無法驗證整個文件是否值得信賴。因此,攻擊者可以在使用者加密之前或通過使用者密碼解密時竊取使用者私鑰。為了進一步解釋,我會參考@ArtjomB 提供的 URI。Javascript 密碼學被認為是有害的

在這一點上,我已經提供了足夠嚴重的安全問題,任何關於上面列出的要求的問題的進一步討論都是毫無意義的。但為了完整起見,我將看看評論中討論的進一步解決方法。

  1. 瀏覽器外掛- 瀏覽器外掛不符合上面列出的系統要求。有關瀏覽器外掛的進一步說明,請查看(Javascript Cryptography Considered Harmful
  2. Web Storage API -比儲存在 cookie 中更好的解決方案,因為離線內容無需通過每個 http 請求傳輸值,但仍然容易受到惡意 javascript 和 xss 的攻擊。

結論:根據上面列出的系統要求,沒有安全的方法可以完成我的要求。JavaScript 不是適合客戶端加密的語言(請參閱Javascript Cryptography Considered Harmful),在撰寫本文時,瀏覽器並非為此目的而設計。

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