2013-10-17 42 views
6

我正在實現一個REST API認證系統。使用時間戳的API身份驗證:當客戶端的時間設置更改時該怎麼辦?

我基本上是使用方法在這個網站解釋說:

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

基本上它採用請求主體創造一個哈希值,它與實際的請求一起發送到服務器,服務器重新創建和進行比較,並沒有什麼...

我不會打擾解釋細節。最重要的部分是我使用時間戳爲了防止「重放攻擊」。

從網站引用,它說明:

當前服務器的時間戳進行比較,以時間戳的客戶端發送。確保兩個時間戳之間的差值在可接受的時間限制內(5-15分鐘),以阻止重放攻擊。

我現在面臨的問題是,如果客戶端的時鐘設置被修改,可能會導致意想不到的API認證失敗,因爲時間戳的客戶端和服務器之間變化。

有沒有辦法解決這個?我必須放棄使用時間戳嗎?

我會非常感激,如果有人可以幫助我走出這個時間戳問題的解決方案,或者我可以防止重放攻擊任何其他方式。

注意:我知道給客戶端發佈一個nonce是防止「重放攻擊」的一種很好的方法,但是我想做出我最後的選擇,因爲創建nonce-issued- API和用於管理臨時數的後端太大。

+1

如果客戶端的時鐘設置進行修改,坦言有的確會認證失敗,沒有人能除了客戶端之外的幫助必須調查並更改設置。有幾件事情真的不用擔心。 5-15分鐘也是一個可以接受的限制。它應該是+60秒。不要停止發送時間戳的想法,只爲一個不負責任的客戶。你的問題是非常好的。 – Satish

+0

嗨,我有同樣的問題,你解決它嗎?謝謝 –

回答

2

當比較服務器與客戶端發送時間戳時間戳,它並沒有成爲客戶的時間戳,而是由服務器向客戶端發送的previuously時間戳。 你永遠不能依賴客戶自己的時間戳,因爲它可能是任何東西,或者它可能在世界的另一邊。

當客戶端連接到服務器的第一次,服務器可以從自身回覆時間戳和存儲在客戶端上,在下次客戶端必須發送最後的時間戳接收。

+0

謝謝!接收從服務器到客戶端的時間戳實際上與接收來自服務器的「隨機數」相同。我同意這是一個非常有前途的解決方案。但是,爲了完成這項工作,我需要每次創建一個API請求時獲取新的時間戳。我真的不希望收到針對我提出的每個API請求的額外HTTP請求...請糾正我,如果我錯了。 – ashiina

+0

您不需要任何額外的HTTP請求。在客戶端的每個請求上,服務器都會返回一個時間戳。客戶端存儲此時間戳,並在下一次請求時附加此信息作爲附加參數。 –

0

我想你想你的時間戳是UTC時間更新文章指出。

+0

謝謝。正如我對另一個人所評論的那樣:我認爲我正在獲得「自時代以來的秒數」。但是,如果客戶端(例如iPhone)更改其設備的時鐘設置,那麼該值就不會改變。這就是現在正在發生的事情。我的理解是正確的嗎? – ashiina

0
+1

謝謝。我認爲我得到了「自時代以來的秒數」。但是,如果客戶端(例如iPhone)更改其設備的時鐘設置,那麼該值就不會改變。這就是現在正在發生的事情。我的理解是正確的嗎? – ashiina

+0

我不這麼認爲,但我可能是錯的。 – Kristian

相關問題