2009-12-10 94 views
53

我正在創建一個Web應用程序,它將使用OpenID登錄和OAuth令牌與Youtube。我目前在數據庫中以純文本形式存儲OpenID身份和OAuth令牌/令牌密鑰。Securly存儲OpenID標識符和OAuth令牌

將這些值存儲爲純文本不合適嗎?我可以使用OpenID標識符的單向加密,但我不知道這是否有必要。對於OAuth令牌,我需要使用雙向加密,因爲我的應用依賴於獲取會話令牌的某些用途。

是否需要加密OpenID身份?有人可以使用它來訪問用戶的帳戶嗎?

回答

27

首先,有一個註冊申請consumer_keyconsumer_secret

當用戶驗證並「允許」您的註冊應用程序時,您會收到: 和access_token,這被認爲是用戶的「密碼」,並允許您的應用程序僅代表用戶採取行動。

因此,從數據庫中獲取用戶的access_token對於完全訪問沒有consumer_keyconsumer_secret也無濟於事。

服務提供商根據請求比較所有4個參數。在存儲之前加密這4個參數並在響應之前將它們解密是明智的。

這就是您需要代表用戶更新或更改用戶資源所有者的情況。要讓用戶登錄到您的網站,請使用會話。

+28

如果您將OAuth 2.0與承載令牌一起使用,則不是這種情況。所有你需要的是訪問令牌(auth令牌)來訪問用戶數據。有些事情要小心。 – FajitaNachos 2013-03-04 03:18:44

11

這裏有兩個學派。

第一個參數是:您應該對待OAuth令牌,如密碼。如果有人訪問您的數據庫,獲取所有OpenID/OAuth對並運行中間人攻擊,他們可以模擬您網站上的任何用戶。

第二個參數是:當某人有權訪問您的數據庫並且有足夠的權限訪問您的網絡以運行中間人攻擊時,無論如何您都會受到攻擊。

我個人會在謹慎的方面犯錯,只是加密它們;這是密碼的標準做法,所以你不妨給自己一點點額外的安心。

與此同時,谷歌有這樣的建議:

「標記應儘可能安全地視爲存儲在服務器上的任何其他敏感信息。」

來源:http://code.google.com/apis/accounts/docs/OAuth.html

和網絡上一些隨機的傢伙有具體實施意見:

  • 如果他們是在一個普通的磁盤文件,使用文件系統權限 保護他們,確保他們' 已加密,並很好地隱藏了密碼
  • 如果它們位於數據庫中,請對字段進行加密,存儲密鑰 ,並保護對數據庫本身的訪問小心。 *
  • 如果他們在LDAP中,請執行相同操作。

http://brail.org/wordpress/2009/05/01/implementing-oauth-take-care-with-those-keys/

+2

如果有人仍然在追蹤這個問題 - 我非常同情這種加密這種東西的想法,但是它觸發了我的新手大腦,我們只是將問題推到另一個層面 - 我們可以加密,但是現在我們必須把加密祕密放在某個地方,並防止IT被盜。把它放在webroot之外的某個文件中足夠了嗎? – 2012-02-15 01:40:46

+2

Web服務器用戶無法訪問的webroot外部文件(以防他們以這種方式獲取)。或者是一個單獨的PKI基礎設施,只是各種各樣的複雜。這可以防止攻擊者找到轉儲數據庫的方法,但不是整個文件系統 - 比如通過SQL注入攻擊。 – 2012-02-16 14:04:50

+0

感謝您的更新;這就是我要走的方向。 – 2012-02-16 16:47:22

0

的OpenID URL不應該被加密,因爲這是你的 「開放ID」 從字面上看,每個人都應該知道的值。此外,URL需要是數據庫中的索引,並且對數據庫中的索引進行加密始終存在問題。

如果您必須長期存儲令牌,OAuth令牌/機密應該是保密的,並且加密可以提高安全性。在我們的OAuth消費者應用程序中,令牌/祕密僅在會話中存儲一段時間,我們選擇不加密它們。我認爲這足夠安全。如果有人可以窺探我們的會話存儲,他們可能也有我們的加密密鑰。

+0

不完全正確。 OpenID網址不一定是公開的。爲了防止RP之間的相關性,Google使用定向身份,以便每個RP爲同一用戶獲得唯一的OpenID。如果所有這些都是公開的,從字面上來說每個人都知道這些價值,那麼相關性將再次成爲可能。 – 2009-12-10 14:42:09

+0

OP正在談論後端數據庫。它是公開的,你有更多的隱私問題需要處理。 – 2009-12-10 15:33:22

18

OAuth令牌和祕密應該在您的數據庫中明顯保持安全,但您無法像使用密碼一樣使用單向加密來存儲它們。原因是您需要令牌和祕密才能簽署請求。

如果您正在運行OAuth服務器,您仍然需要原始的令牌/密碼來驗證請求。

如果您希望您仍然可以使用2路加密算法(如AES)對它們進行加密,以便在數據庫或數據庫備份受到威脅時提供安全保護。

+2

其他答案說他們作爲密碼,但這個答案很好,因爲它指出你需要一個2路加密算法。使用散列密碼,您可以散列用戶輸入的內容,並根據散列密碼進行檢查。有了令牌和祕密,您需要重新獲取原始文本。 – paulmorriss 2010-10-05 16:18:22

+0

雙向加密算法?你的意思是公鑰加密像RSA(應該使用兩個不同的密鑰)? AES是「雙向」,因爲您可以對其進行加密和解密,但只能使用相同的私鑰。 – Lekensteyn 2011-10-09 20:21:42

+2

@Lekensteyn可能是AES,與單向加密散列函數相比,它是雙向的。當你在同一個環境中使用這兩種公鑰時,公鑰和私鑰加密不會給你帶來很多麻煩。 – skeggse 2014-08-16 21:10:57

0

是的,這些應該在數據庫中靜態對稱加密(比如CBC模式下的AES-256)。加密這些令牌的簡單方法是使用SecureDB的加密作爲服務RESTful API。

披露:我在SecureDB工作。