2012-01-01 54 views
3

我有一些Ruby Web應用程序使用OpenID進行身份驗證並將會話存儲在cookie中。有一些API和AJAX相關的東西,我的Ruby框架並不適合,所以我有一些node.js服務。問題是,如果有人知道我的AJAX服務的URL,他們基本上將公開向公衆開放。目前這些服務對Origin標頭進行了簡單的檢查,但顯然這很容易僞造。有沒有處理跨框架認證的標準方法?

因此,我希望能夠限制對運行在Node(或Python,或基於非Rack的Ruby服務或其他任何服務)上的服務對登錄到運行的「主」服務的用戶的訪問通過基於Rack的Web應用程序。這種事情是如何完成的?我見過大量的網站將通過example.com提供內容和網頁,然後通過api.example.com獲得AJAX電話,所以我很驚訝,這是我沒有讀到的東西。

我有如何做到這一點的想法,我很想對我是否失去了一些東西言自明,使這個不安全的一些反饋:

我Ruby的web應用程序使用OpenID認證和商店在會話cookie中使用Rack::Session進行會話。從看Rack::Session源,我的框架似乎要經歷這個過程:

  • 生成我的用戶對象
  • 的元帥轉儲基於密鑰
  • 商店元帥的SHA1哈希十六進制在cookie消化SHA1哈希的

所以理論上我可以有預先安排的鍵或系統用於產生密鑰,或框架之間的一些消息傳遞通過安全信道來共享密鑰。然後我可以在任何想要驗證會話數據的框架中反轉加密過程。當然,我不得不擺脫第一步,只存儲JSON數據或其他內容,而不是Ruby對象以實現跨語言兼容性。

這是否被認爲是一種安全的做事方式,假設共享密鑰的協議是否適當安全?

+0

您的機架服務器將會話存儲在數據庫中並將該ID放入Cookie中。您的所有節點服務器必須執行的操作是從Cookie中讀取ID,查看數據庫中的會話並檢查該會話是否經過授權。 – Raynos 2012-01-01 14:01:37

+0

這是真的嗎?從這裏http://rack.rubyforge.org/doc/Rack/Session/Cookie.html查看源代碼,它是所有客戶端存儲 - 因此我認爲這是加密。難道一個持久的數據庫不會像Rack這樣輕量級的設備出現性能問題?並打破跨服務器負載平衡? – Cera 2012-01-01 15:09:16

+0

其實,我認爲我可能誤解了你的評論,因爲你建議它已經以這種方式工作,而不是我以這種方式實施。 我認爲,但問題是我有一個可擴展性問題,必須使該數據庫在負載平衡的虛擬服務器中保持不變,並且必須擔心保護這些數據庫。另外,似乎沒有任何安全措施可以防止cookie中僞造的ID? – Cera 2012-01-01 15:10:37

回答

3

你描述的是一個消息認證碼(MAC);在這種情況下,它是基於哈希的MAC或HMAC。基本上,要表示要驗證的數據(確保來自某個源),向其添加密鑰並散列整個內容。然後將計算出來的散列附加到消息中(你剛剛散列的東西減去密鑰)。當接收方收到該消息時,它將獲取數據,並將相同的共享祕密添加到該消息中,並對其進行散列。如果該計算值與作爲消息一部分收到的計算值相同,則該消息是真實的,應該進行處理;如果哈希不匹配,它不是來自應該來自的派對,而應該被丟棄。

你可能想看看RFC指定HMAC結構(只是不使用示例代碼,因爲它仍然使用MD5;使用類似SHA-256和SHA-512來實現你的HMAC): http://www.ietf.org/rfc/rfc2104.txt

相關問題