2011-03-22 70 views
2

我有一個Web應用程序,我想通過API或Web服務訪問某些功能。我的問題是我想控制我的API可以從哪裏訪問,也就是說,我只想讓我創建或批准的應用程序可以訪問我的API。該API將是一個基於Web的REST服務。我的用戶不會登錄,因此沒有用戶身份驗證。最有可能的用例和現在使用的用例是應用程序將是iOS應用程序。 API將用django/python編碼。控制訪問Web服務/ API的安全措施

鑑於無法查看iOS應用程序的源代碼(我認爲,糾正我,如果我錯了),我最初的想法是,我可以只是有一些祕密密鑰傳入API的參數。然而,任何聽到連接的人都能看到這個鍵,並從世界其他任何地方使用它。

我的下一個雖然是我可以添加一個先前的步驟。在應用程序使用API​​之前,它必須通過挑戰。在第一次請求時,我的API將創建一個隨機短語並使用某個密鑰(RSA?)對其進行加密。原始未加密的短語將被髮送到應用程序,該應用程序還必須使用相同的密鑰對短語進行加密,並將加密的文本與其請求一起發回。如果加密匹配,應用程序可以訪問,但如果不是,他們不會。

我的問題是:這聽起來像一個很好的方法,如果有的話,是否有任何現有的庫可以做這些類型的東西?我現在將在Python服務器端和客戶端客戶端工作。

回答

2

如果您希望API消費者始終在同一個IP上請求,最簡單的解決方案應該是IP白名單。

如果你想支持從任何地方'驗證'的能力,那麼你在正確的軌道上;共享加密方法然後請求用戶發送具有加密的api消費者句柄/密碼/請求日期的請求會容易得多。您的服務器解碼加密值,根據您控制的白名單檢查句柄/密碼,然後驗證請求日期是否在某個有效的時間範圍內;也就是說,如果請求日期不在1分鐘之前,請拒絕請求(這樣,有人截取加密值,它僅在1分鐘內有效)。由於請求時間不斷變化,加密值不斷變化,因此認證密鑰不斷變化。

這是我的反正。

0

除了Tejs的回答,一種已知的方法是將操作系統的產品ID(或客戶端機器的另一個唯一ID)與用戶已知但未存儲在應用程序中的特定密碼綁定,並使用它們來加密/解密消息。例如,當你得到獨特的號碼。從用戶那裏給你提供密碼,這樣他們就可以完成對方,爲RC4創建一個種子X,並將其用於加密/解密。這個種子X也是服務器所知道的,並且它也用它來加密/解密。我不會告訴你,這當然是最好的方式,但假設你信任最終用戶(但不一定能夠訪問此計算機的任何人),這似乎就足夠了。

另外,加密一個良好的Python庫pycrypto

0

在第一個請求,我的API將創建一個隨機的短語,並與一些祕密密鑰進行加密(RSA?)

閱讀起來在http://en.wikipedia.org/wiki/Digital_signature看到這種握手背後的故事。

然後閱讀了關於

http://en.wikipedia.org/wiki/Lamport_signature

而且它的表妹

http://en.wikipedia.org/wiki/Hash_tree

的想法是,簽名可以使用一次。在iOS代碼中籤名的妥協並不重要,因爲它是一次性使用密鑰。

如果您使用哈希樹,您可以通過在iOS二進制文件本身上構建哈希樹來獲取許多有效簽名。服務器和iOS應用程序都可以訪問用於生成簽名的相同 文件。