2011-06-23 79 views
5

我正在尋找一種方式,以客戶方解碼RSA分別OpenSSL的編碼消息。OpenSSL的解密在瀏覽器

理念:
特殊的數據只存儲加密的服務器上的公共密鑰,這樣沒有人能夠看到真實的數據 - 即使是在服務器的黑客案件。
在adminforce的管理員則可以通過將其transfering到瀏覽器和「打開」這些文件的一些JavaScript代碼,以便它永遠不會解密的服務器上,只有在安全客戶方的數據進行解碼。
我真的需要它在自定義JavaScript瀏覽器中直接解碼,因爲這些數據已被js中的某些算法clientide使用。

問題:
似乎沒有OpenSSL庫中的JavaScript或我沒有找到一個還沒有。雖然有多種純JS實現RSA的,他們只是實現了簡單的RSA算法,但是,普通的RSA是不是安全使用的塊加密,並具備「choosen明文攻擊」一些攻擊。
是否有人知道openssl解碼的JavaScript實現,或者爲Firefox添加這些功能到文檔的插件?或者任何其他安全的非對稱加密內置到JavaScript?

+1

這種方法存在一個小小的缺陷:如果你的服務器被黑客入侵,攻擊者很可能會改變它所服務的JavaScript,這可能會將解密後的內容透明地發送回服務器(從而攻擊者)。依賴JS意味着客戶端在發生這類攻擊時不再安全。你最好爲此開發一個獨立的應用程序,也許是一個簽名的Java WebStart(或Applet),只要它沒有用服務器上保存的私鑰簽名。 – Bruno

+0

布魯諾你說得很對,但我不需要在服務器可能泄露的網頁上運行openssl的js實現。我想寫一個瀏覽器的擴展,不能被網頁上的惡意js-code破壞。 –

回答

3

正如我在你的問題中留言指出,攻擊向量你設想(破壞服務器)意味着JavaScript是有可能被泄露過,在這種情況下在客戶端運行不該JavaScript代碼無論如何都不會被信任。(使JavaScript在後臺發送一個異步請求的解密數據回到服務器上會很容易:因爲服務器將在攻擊者的控制之下,所以不需要任何技巧來繞過它)

我會建議走下獨立應用程序(如Java WebStart)的路線,也許簽名(使用不在服務器上保存的私鑰)。

如果您仍然願意繼續使用這種體系結構,請不惜任何代價將用戶的私鑰釋放到JavaScript中。這可能會損害用戶的私鑰,而不僅僅是加密的數據。

當您在瀏覽器中使用私鑰進行SSL/TLS客戶端證書驗證時,私鑰不會暴露給服務器使用的任何代碼。它被瀏覽器用於握手,並且服務器獲取證書(這是公開的),但私鑰不會接近HTML + JS代碼可以看到的任何地方。 (事實上​​,在Safari中的OSX中,私鑰被底層SSL/TLS庫使用,甚至不會暴露給用戶進程。)

我見過的RSA JavaScript庫需要直接使用私鑰,也就是說,他們需要能夠直接使用私有指數。如果你處於不能信任服務器的情況,那顯然不是很好。

能夠在瀏覽器中使用私鑰來進行RSA操作,而不讓腳本獲取私有資料本身,這需要與瀏覽器更緊密地集成,特別是一些API可以使用這些API來簽名和解密直接在瀏覽器的安全機制中運行,而無需公開私鑰材料(總體而言,PKCS#11爲使用它的應用程序提供了類似的方法)。

據我所知,目前的Mozilla crypto JavaScript API沒有提供使用瀏覽器解密/簽名的功能(僅限於證書請求和密鑰生成)。似乎有計劃地做到這一點,雖然:

在IE者平臺,CAPICOM應該引起大家的興趣,但它似乎是時下deprecated

+0

即使網頁遭到攻擊者的破壞,Firefox也可以保存私鑰。我已經搞砸了Mozilla Crypto API,但遺憾的是,它確實不支持這一點,我沒有問它是否會受到支持:-( –

+0

的確如此。說實話,我還沒有試過DOMCrypt(as在這裏提到),但它也是開源的,所以它可能是值得研究的:https://github.com/daviddahl/domcrypt。你當然需要安裝插件,但它似乎不是一個糟糕的解決方案 – Bruno

+0

不是我希望得到的答案,但我不會使用我的備份計劃來構建一個獨立的工具,而似乎沒有一個自定義firefox插件在JavaScript中可以互操作的良好解決方案 –

1

Encrpytion是複雜和昂貴的 - 特別是不對稱encrpytion(在大多數情況下,不對稱加密僅用於加密隨機生成的對稱算法密鑰)。

有RSA的實現(在javascript中可能還有其他不對稱算法),在某些情況下,還有其他語言的兼容實現(通常是C) - 嘗試谷歌的具體細節 - 但我不知道任何處理x509加密。 OTOH編寫一個Java小程序來做到這一點將是微不足道的。

但何必呢?根據我對您寫的內容的理解,您可以通過使用對稱算法獲得同樣多的功能,而且不會將密鑰發送回服務器:

  1. 允許用戶輸入一些在網頁中
  2. 數據允許用戶輸入加密密鑰
  3. 加密使用的密鑰
  4. 加密後的數據發送回服務器
  5. 提供解密頁面,用戶可以檢索加密數據內容並輸入密鑰
  6. 解密內容
+0

「...但我不知道任何處理x509加密」:沒有關於X.509加密的具體內容。如果它是帶RSA密鑰的X.509證書,那麼重要的是RSA算法,而不是X.509包裝(更重要的是,因爲只需要私鑰來解密,這與公鑰的方式無關「打包」:在X.509證書中,PGP證書或普通公鑰)。 (在DSA中使用X.509證書中的DSA密鑰時也是如此) – Bruno

+0

我知道非對稱加密很昂貴,但我只需要編碼幾個字節。Symetric Encryption不是解決方案,因爲服務器有(臨時的)知道密鑰的權利,所以這是一個不適用於此目的的解決方案。雖然「用戶」不知道加密,但他將數據發送到服務器而不需要任何加密知識,並將其存儲在那裏加密以供管理員查看數據。 –

+0

@Tobias P .:「服務器知道密鑰(臨時)」 - 您正在考慮通過使用大量複雜的算法來確保系統安全。服務器需要臨時知道密鑰的唯一原因是對加密內容的臨時訪問 - 您可以通過將未加密的副本與加密內容一起發回來執行此操作。 – symcbean

0

想想這個。如果存在服務器黑客攻擊,黑客將可以訪問您的加密數據和所有網站源代碼。包括用於解密數據的那個。並且可以通過查看頁面的來源以純javascript的形式從網站界面獲取這些內容。

+0

雖然,它不會得到最終用戶的私鑰。這仍然需要合法用戶採取行動。 – Bruno

+0

@布魯諾。找到一些http://www-cs-students.stanford.edu/~tjw/jsbn/ – TheBrain

+0

@TheBrain:你是什麼意思?當然,您可以在JavaScript中實現RSA算法,但它如何幫助攻擊者獲得對私鑰的訪問?對於一個安全的系統,瀏覽器永遠不應該將私鑰發佈給JS。 – Bruno