2012-08-28 46 views
5

我需要在我們的配置數據庫中存儲第三方密碼,以便用戶可以保存其可通過我們的服務器訪問的Web服務的登錄信息。如何安全地將密碼存儲到我的數據庫中的第三方Web服務?

我需要將密碼傳遞給Web服務,所以我不能只散列密碼並存儲散列。我需要能夠獲得發送到服務的實際密碼。

出於安全原因,我想加密我們存儲在數據庫中的密碼。我所看到的關於加密密碼的一切似乎都是「散列它,不加密它!」但我不認爲這適用於這種情況。

我想知道如果這是更好地處理加密/解密在VB.NET代碼或使用SQL Server來完成它(從我所看到的here,它至少可能做的SQL,但我我不確定這是否合理,我需要進一步研究以找出部署問題會是什麼樣子)。

+0

請詳細描述爲什麼你不能哈希你的密碼。將它傳遞給Web服務的要求如何改變? –

+2

你是對的 - 哈希不是解決這個問題的方法。不確定你正在尋找什麼樣的「最佳實踐」 - 因爲這個術語太寬泛而模糊。 – Oded

+0

@JustinSkiles - 更多詳細信息?密碼需要可恢復,這意味着哈希不在圖片中。 OP描述足以確定這一點。 – Oded

回答

1

我同意George Stocker。如果你可以使用現有的協議 - 去配合它(它會減少可能的問題和安全漏洞的10倍)。

只是在這種情況下,如果你沒有選擇(不能使用任何協議)。如果您需要訪問第三方的網絡服務器,只有當用戶執行服務器上的東西,我建議如下:

  • 不存儲密碼在你的數據庫

  • 用密碼創建cookie第三方服務並使用某個密鑰進行加密。將此cookie發回給用戶。

  • 只要用戶返回到您的網站,您將獲得cookie,解密它,從cookie獲取密碼並使用它來訪問第三方web服務。

所以,在這種情況下,如果有人會破解你的服務器並將複製數據庫,他們將不會有密碼到第三方Web服務。在這種情況下,如果有人會攻擊用戶電腦,所有的cookies都會被加密,所以他們將無法對他們做任何事情。

這是唯一的安全弱點,如果有人能夠注入一些代碼到您的服務器,並將從活動用戶會話中捕獲密碼。

0

一般來說,最好散列密碼是真的,但在你的情況下似乎是不可能的。我肯定不會推薦使用SQL服務器本身的對稱密鑰進行加密,原因是如果您的SQL服務器受到威脅,那麼您的加密也會受到影響(因爲密鑰將位於同一臺服務器上)。

我會建議的一件事是,你在某個地方使用臨時存儲,這可能是在會話中的東西。不過要小心使用會話和cookie,因爲你可能容易受到CSRF攻擊和session/cookie劫持攻擊。你可以做的一件事就是讓用戶輸入密碼,然後加密並將其存儲在他們的cookie中,將他們的客戶IP附加到cookie中,然後在開始時添加一個時間戳以便過期(這也會使雪崩效應更加有效,因爲你正在改變你的明文開頭的位)。要求向Web服務發出一個請求,使其附加一些在客戶端呈現的CSRF令牌,並且它是POST而不是get,最後驗證客戶端IP,並且時間戳不超過x分鐘/小時(取決於你想成爲多麼偏執)。

如果用戶的cookie被盜,那麼他們將無法提出請求,因爲它特定於他們的客戶端IP(除非他們欺騙了用戶IP,但在此時您意識到這個攻擊者並不那麼聰明,確定還有其他更簡單的攻擊媒介,這會使它們獲得更大的有效載荷)。如果用戶能夠以某種方式欺騙IP,他們將無法長時間使用它,因爲超時會使cookie無效。如果用戶足夠聰明,可以很好地破壞你的加密算法...那麼你幾乎沒有機會擺在首位。

相關問題