2012-05-18 177 views
4

我在寫東西needs to do electronic signatures使用Javascript中的加密PGP私鑰生成PGP密鑰對並對文本進行簽名

有些用戶會像我這樣的怪人,並且已經擁有自己的PGP密鑰。大多數人不會,也不會想安裝或維護它。

作爲一種變通方法解決,我要做到以下幾點:

  1. 對於使用單獨的「簽約」密碼的用戶創建一個公共/私有密鑰對。
  2. 當我需要用戶簽名時,爲用戶提供明文,以及其他一些信息,如時間戳和其他引用,並讓他們用我存儲的私鑰簽名。

基本上有兩種方法可以做到這一點(對於沒有自己的PGP密鑰的用戶)。

  1. 用戶通過SSL向我提交簽名密碼。我生成私鑰密鑰對服務器端,並在需要簽名時臨時解鎖私鑰。我根本不存儲密碼,並且儘快解除了解鎖的私鑰。
  2. 用戶使用Javascript生成pub/priv鍵。他們寄給我公鑰和加密的私鑰並保存在本地存儲中。當他們需要簽名時,我確定他們的本地存儲有它(如果不是),他們解密並使用JS在本地簽名文本。我從來沒有看到他們的簽名密碼或他們解鎖的私鑰。

無論哪種方式,我也簽署結果w /服務器的密鑰。但我需要那裏有一個用戶獨特的,不可否認的方式讓用戶簽署文本,並讓他們擁有我所維護的PGP密鑰是最簡單的方法。

選項1做起來簡單很多,而且運作良好,足以滿足我的最低需求。

選項2更可信一點,除非我顛覆了JS(我仍然可以這樣做),我無法親自使用它們的權限。

然而,爲了做到這一點,我需要一個JavaScript庫,可以

  1. 產生酒吧/私法密鑰對
  2. 解密使用的私鑰
  3. 標誌的文本與塊私鑰

什麼庫可以做到這一點?

P.S.請注意,我不需要加密給定的公鑰。我需要用戶以標記與他們自己的(加密 - 存儲)密鑰。

回答

3

首先,請閱讀這篇文章:http://www.matasano.com/articles/javascript-cryptography/

如果你仍然相信JavaScript的加密是你在做什麼,然後一個好主意:

PGP是相當複雜的,你不需要它所做的95%,我會建議你,而不是考慮使用Ed25519簽名 - JavaScript版本可在http://www.flownet.com/ron/code/ed25519.js。這是一個基於橢圓曲線的系統,比RSA具有更高的安全性和更小的密鑰。實際上,密鑰非常小,因此您可以讓用戶選擇「簽名密碼」,將其用戶的用戶ID作爲salt提供給scrypt [1],並將輸出用作私鑰(您只需要frob三位以使其成爲有效的Ed25519私鑰)。

  1. https://github.com/cheongwy/node-scrypt-js
1

我認爲你的文章聲稱錯誤的東西。 例如,它說,沒有辦法阻止例如math.RND()被覆蓋 - 但它可以很容易地完成 - 在文件頂部用內聯js編寫html文件。 在那個代碼中你凍結了每個對象,openpgp.js依賴於。

Object.freeze()

,所以你可以建立一個安全的ENV。確實! 將index.html轉換爲ssl, 凍結什麼是重要的,防止其他js文件被加載, 確保不允許連接到其他服務器,等等。

相關問題