2010-03-09 22 views
5

我不介意盜版等等,但我想確保後端(基於Rails)不可用於可以DOS等自動化服務。因此,我想簡單地確保所有訪問後端(這將是一些REST查詢GET和PUT數據)將通過有效的iPhone應用程序,而不是一臺機器上運行的腳本。具有服務器後端的iPhone應用程序 - 如何確保所有訪問僅來自iPhone應用程序?

我想避免使用帳戶,以便用戶體驗無縫。

我的第一個意圖是將UDID和一個祕密散列在一起,並通過與服務器的HTTPS連接提供(和UDID)。這將允許創建經過身份驗證的會話或返回錯誤。

如果被竊聽,攻擊者可以拿走哈希並重放它,讓這個方案打開重播攻擊。但是,HTTPS連接不應該保護我免於竊聽?

謝謝!

回答

6

就像bpapa說的那樣,它可能被欺騙了,但是就像你說的那樣,你並不擔心任何人的到來,只是連續發送一千個請求到你的服務器,而你的服務器處理每一個。

你對散列的想法是一個好的開始。從那裏,你也可以將當前的時間戳附加到預先哈希的值,並且一起發送。如果給定的時間戳與服務器的當前時間不同於1天,則禁止訪問。無論如何,這會在一天之後停止重播攻擊。

另一種選擇是使用隨機數。任何人都可以從服務器請求一個隨機數,但是設備必須在將散列發送到服務器之前將其附加到預散列數據。生成的隨機數將不得不被存儲,或者可能僅僅是服務器當前的時間戳。然後,設備必須將服務器的時間戳而不是其自己的時間戳附加到預先哈希的數據上,從而允許發生重放攻擊的時間比整天更短。

+0

我認爲這可能是我要走的路。我沒有考慮過時間戳(或者至少是當前的日期),我喜歡它阻止重放攻擊的方式。如果有人在午夜前半秒提交請求,並且服務器選擇第二天爲哈希取日期值,可能會有一些輕微的打嗝和散列不匹配,但只要我檢查任何一方的日期,它應該是好。 我認爲這代表了很好的選擇組合。我會得到一個SSL證書,所以我不能被竊聽,並且使用一個包含數據的時間和密碼的散列。 謝謝! – Nex 2010-03-11 14:24:36

2

無法確保它,因爲它可能被欺騙。

如果你真的想走這條路線(說實話,除非你在這裏做的超級任務至關重要,否則你可能在浪費你的時間),你可以傳遞iPhone設備令牌。或者哈希它,然後傳遞它。當然,你無法在服務器端或任何其他地方驗證它,但如果一個壞人真的想把你關閉,這裏是第一個路障,他必須先處理。

3

在客戶端證書中使用SSL。在您的客戶端有一個私鑰併爲其頒發證書,並且您的Web服務器可以要求此客戶端證書存在才能繼續進行會話。

我無法提供Rails的代碼詳細信息,但架構明智地說它是最安全的事情,儘管可能有點矯枉過正。具有證書的SSL是標準的行業解決方案,並且iPhone /客戶端和服務器端均存在庫,因此您不必發明任何東西或實施很多,只需讓它們一起工作即可。

你也可以考慮HMAC,就像HMAC-SHA1,它基本上是其他人在這裏討論的哈希值的標準化。如果你添加了隨機數,你也可以安全地防止重放攻擊。有關如何使用隨機數來實現HMAC-SHA1的想法,您可以查看OAuth協議(不是整個流程,而是它們如何將nonce和其他參數一起綁定到經過驗證的請求中)。

+0

這是一個夢幻般的答案。我認爲在客戶端擁有私鑰可能會讓我感到太複雜,但是我明白這是最正式和最安全的方法。我一定會看看需要什麼,謝謝! – Nex 2010-03-11 14:20:40

相關問題