1

我只需要一個公鑰加密方案,我可以用它來加密由iPhone應用發送到服務器上的PHP的參數。因爲它的許可證我不能使用GnuPG。我可以使用OpenSSL來加密URL參數嗎?

要求是,手機上的應用程序能夠與服務器通信,而無需用戶輸入任何憑據。我的目標是防止通過欺騙檢查URL中的參數和濫用我們的系統。因此,爲了進行加密,我們應用程序的所有副本都可以看起來像是同一個用戶。我沒有計劃使用HTTPS,因爲(如果我沒有弄錯)它需要會話或證書,它似乎過度(但讓我知道如果不是);我只需要加密和解密URL的參數部分。

由於要用RSA公鑰加密的數據必須小於密鑰,因此標準過程是生成一個對稱私鑰,使用公鑰對其進行加密,然後使用生成的私鑰對數據進行加密,然後將生成的私鑰和加密數據發送給服務器。它看起來像我需要加密生成的密鑰的大部分內容(除了進程中的RSA_size()崩潰)。但我不知道如何使用Blowfish或PHP支持的其他算法來指定和設置批量數據的編碼。

感謝您的任何見解。

+1

你無法使用HTTPS安全地發佈數據的任何原因? – BoffinbraiN 2011-05-10 11:10:58

+0

也許不是;我不知道涉及到什麼。要求是電話上的應用程序能夠與服務器進行通信,而無需用戶輸入任何憑證。我的目標是防止通過欺騙檢查URL中的參數和濫用我們的系統。因此,爲了進行加密,我們應用程序的所有副本都可以看起來像是同一個用戶。我會在上面的描述中添加這個。感謝您的回覆。 – Oscar 2011-05-10 19:17:38

回答

2

這是可能的。

您可以使用RSA公鑰密碼算法,不需要任何PGP或X.509v3繞過它們的任何開銷和基礎結構。

  1. 生成公私密鑰對。
  2. 將私鑰安全地存儲在服務器上。保護好它。
  3. 將公鑰分配給iPhone應用程序。
  4. iPhone應用使用公鑰加密數據。
  5. iPhone應用程序將加密數據發送到服務器。
  6. 服務器使用私鑰解密加密的數據。

可以玩弄使用openssl命令行工具這樣的想法:

在服務器上運行:

$ openssl genrsa -out myprivatekey.pem 2048 
$ openssl rsa -in myprivatekey.pem -pubout -out mypublickey.pem 

複製mypublickey.pem到客戶端,並且在客戶端上創建在data.dat文件和一些數據運行:

$ openssl rsautl -encrypt -pubin -inkey mypublickey.pem -in data.dat -out enc.dat 

發送enc.dat到服務器,然後在服務器上運行:

$ openssl rsautl -decrypt -inkey myprivatekey.pem -in enc.data -out data2.dat 

公鑰沒有被保護,所以你可以在任何你想要的方式分發到iPhone應用程序。例如,將其嵌入到應用程序中,將其放在公共Web服務器上,通過不安全的電子郵件發送給客戶端。如果壞人得手,這沒有問題。

注意:在這個例子中,我創建了一個2048位的RSA密鑰。請記住,對於非對稱算法(即公鑰算法),您需要更長的位長密鑰才能達到與用於對稱算法的密鑰相同的安全級別。不要以爲128位AES加密功能非常強大,所以我只需要創建一個128位的RSA密鑰 - 對於RSA密鑰來說太短了,並且不會給您所期望的安全強度。

現在你只需要通過調用代碼中的openSSL庫來實現它。

+0

非常感謝;這正是我所尋找的(儘管我不知道它是否比我的目的HTTPS好)。我會給它一個鏡頭。 – Oscar 2011-05-10 19:25:06

+0

如果你不知道它是否更好,那麼它不是。 – Hoylen 2011-05-10 21:17:51

+0

我有爲手機編譯的OpenSSL加密庫。現在我需要使用C代碼而不是命令行語法在手機上執行加密步驟。數據和公鑰將來自內存中的結構而不是文件。 – Oscar 2011-05-14 22:25:07

1

我想,我也不是很確定 - 如果你需要加密數據發送,而你沒有通過HTTPS連接,那麼你可以嘗試實現一些JS加密模塊。 (我發現http://www.hanewin.net/encrypt/)您可以基於用戶名或客戶端電腦的名稱生成密鑰。

+0

Javascript將不會用於iPhone應用程序(沒有一些費力的解決方法),並且您鏈接到的項目受到阻止我使用GnuPG的相同許可證的阻礙。 – Oscar 2011-05-10 19:07:02

+0

好的,謝謝。 – 2011-05-11 06:26:50

0

另一種可能性是不使用公鑰/私鑰加密,而是使用對稱密鑰加密。您可能想要做的是每個會話都有客戶端應用程序生成一個密鑰,使用單個HTTPS連接發送該服務器可用來解密參數的密鑰。現在,您的所有常規連接都可以使用只有客戶端和服務器知道的密鑰加密參數。它應該是唯一的每個設備和可能會話。您可能希望將時間戳與它關聯起來,以便您知道在它長時間處於非活動狀態之後,它可以被丟棄,或者被視爲來自無效會話。

+0

謝謝,但沒有任何會話。這些是獨立查詢命中服務器並返回數據;爲我的應用程序維護會話並不實際(或必須)。 – Oscar 2011-05-10 18:58:41

+0

啊,是的,那麼我的想法根本不起作用。 – spowers 2011-05-13 15:57:45

相關問題