2

目標:Website1通過http請求發送Website2用戶數據。瞭解跨域用戶身份驗證

問題:Website2確保數據來自Website1,而不是一些黑客。

注:我不會使用HTTPS來,我認識到,要解決的一個大問題,但現在GAE不支持SSL爲自己的域名:http://code.google.com/appengine/kb/general.html#httpsapps

所以我做了一些偉大的通過在兩個站點之間加密和發送數據來實現,另一個是能夠解密和讀取數據的站點。我在Google App Engine/Python/Django-nonreal上,這個頁面是讓pycrypto工作的一個很好的資源:http://code.activestate.com/recipes/576980/ Kn

因此,我很熟悉知道用戶數據已加密,而且您需要擁有是閱讀它的關鍵,但Website2如何知道請求來自Website1?什麼阻止黑客再次發送完全相同的請求,而Website2認爲這個黑客有效在Website2上做什麼?

例如,有人不能只聽HTTP請求並記錄加密的數據是通過線路發送的?然後黑客可以做他們自己的請求,具有與之前使用的Website1相同的值,並且黑客可以對Website1執行與Website1相同的操作?本質上,黑客會告訴Website2他們是Website1的有效登錄用戶。

總體目標:Website2被告知用戶數​​據,該數據僅來自Website1的請求。除非您的網站1使用相同的加密數據Website1發送到網站2,否則任何其他來自黑客的請求都將失效。

不知道我是否解釋得不夠好,或者是否有一個我基本沒有的基本理解,但感謝您的幫助。

回答

2

爲了防止重放攻擊,您需要包含一個隨機數和MAC(消息認證碼)。

MAC可以簡單地是加密消息內容的HMAC-SHA1。接收方將計算相同的MAC並確保它匹配。 HMAC-SHA1的關鍵必須是雙方都知道的祕密。這一步很重要 - 僅僅因爲你的數據是加密的並不意味着它不能被篡改。特別是,如果攻擊者只能改變隨機數(見下一頁),那麼就會出現問題。所以使用一個適當的MAC。

隨機數應該在消息的加密部分內,並且只使用一次。接收端應記錄隨機數,並拒絕具有相同隨機數的未來消息。這是防止重播攻擊的關鍵。

您可以通過將過期日期附加到現時來避免必須保留無限數量的臨時數。在過期日期之後收到的消息應該被拒絕。在過期日期之後,可以從看到的隨機數據庫中刪除隨機數,再加上幾個小時來考慮可能的時鐘差異。

生成隨機數可能會很難做到正確。這裏有一種技術:

  • 當你的應用服務器啓動時,創建一個新的虛擬數據存儲實體。緩存其密鑰以及啓動時間戳,直到您的應用服務器終止。還要創建一個初始化爲0的計數器。
  • 當您需要一個隨機數時,通過哈希(實體鍵,啓動時間戳,計數器)生成它。然後增加計數器。

您可以在超過最大期望時鐘漂移通過時間段後刪除虛擬數據存儲區實體。幾個小時應該是足夠的。

2

這樣做有多種方式:

使用隨機數

傳遞加密信息的值只能出現一次

驗證

發件人創建一個存儲並與消息一起傳遞的令牌。收件人連接到所稱的發件人並要求驗證。

握手

作爲發送該消息的一部分,發送者具有使用質詢 - 響應機制來認證之前做握手 - cookie用於跨越各個請求

保持狀態

等等..

但是,如果這是驗證,你爲什麼不使用OpenID的?這已經解決了所有這些問題,並且已經爲幾乎所有的平臺/框架準備好了庫。

+0

OpenID並沒有解決重播攻擊_at all_ ... – bdonlan 2011-02-11 17:27:14