2010-01-03 41 views
1

我在Rails中構建了一個基於XML的webservice作爲iPhone應用程序的後端,我想知道如何才能最好地實現auth方案,這將允許我同時使用GET和POST請求 - 即不需要在XML有效負載的主體中發送auth的請求。Rails XML API設計實踐

這裏的皺紋是我沒有使用普通的HTTP驗證。相反,我正在創建一個SHA1摘要以及未經哈希的ID的硬件ID(連接w/a「祕密」字符串預摘要)。我在服務器上驗證它,試圖從請求中重新創建帶有硬件ID的摘要,並將其與來自請求的散列硬件ID進行匹配。

我的問題是這樣的:我應該創建我的服務,以便每個資源上的每個操作都需要包含常用XML結構中的安全上下文的POST XML的有效載荷,還是有更好的方法來實現它?

換句話說,我想使用GET對於像/顯示,/指數等,但因爲我的應用程序目前爲,我不能這樣做,因爲我需要發送包含XML有效負載安全上下文。

也許有一種很好的方法可以有效地實現與Google API的頭文件相同的功能?

每一個安全環境是這樣的:

<request-wrapper> 
    <security-context> 
     <username>joefoo</username> 
     <hardware-id>AE7D128BCA9206E59901</hardware-id> 
     <hashed-hardware-id>cfd7983850301f97f6fdc26b553d1b6170f18bde</hashed-hardware-id> 
    </security-context> 
    ... 
    (remainder of request payload) 
    ... 
</request-wrapper> 

這是Rails的我的第一個XML服務,所以我會很感激在這方面的任何一般的做法的建議爲好。

謝謝!

回答

3

你的認證方案受replay attacks如果「祕密字符串」停留在設備的壽命相同。

此外,可以通過strings(或其他工具)將「密鑰」(如果它嵌入到您的應用程序中)徹底打破您的計劃。

我會改爲使用非對稱密鑰來設置一次性密鑰,然後使用它來散列計數器或其他東西。如果您因某種原因需要硬件ID,請將其加上計數器。這基本上是一個虛擬的SSL實現,所以你可能會坦率地做到這一點(生成自己的證書,並進行罕見的相互身份驗證;但仍然...)。

請記住,發明自己的安全方案几乎總是一個壞主意。

+0

感謝您的迴應 - 這些都是好的。應用程序本身並不重要(沒有個人數據或任何傳輸內容),如果這意味着簡化實現,我一直認爲重播風險是可以的,但是關於僅使用SSL的說法很重要。 – trevrosen

0

我想,這可能是最好簡單地使用這個自定義標題,然後訪問它們在我的控制器的過濾器瓦特/之類的東西:

request.headers['username'] 
request.headers['hardware-id'] 
request.headers['hashedhardware-id'] 

任何思考這是否是一個好/壞理念?

0

如何創建整個XML請求的SHA1摘要,而不僅僅是硬件ID?這樣你就會使重播攻擊變得更加困難。當然,如果沒有時間戳和(可能)隨機數來使每個請求都是唯一的,那麼黑客仍然可以多次重複完全相同的請求(可能使用了帳戶信用或任何其他信息),但至少他們無法從現有的請求,並改變請求的細節,使其做任何他們想要的。

建議步驟:

  • 把你的XML(沒有任何散列硬件-ID),並把它變成一個字節數組。
  • 創建XML字節數組的SHA1摘要。
  • Base-64對XML字節數組和SHA1摘要字節數組(分開)進行編碼。
  • 使用GET或POST發送base-64編碼的XML作爲一個請求參數,並將base-64編碼的簽名作爲另一個發送。