2010-08-31 73 views
1

編輯1:我覺得我之前並不清楚我自己 因此無法將它改爲 。所以,我正在創建一個系統 ,我正在通過IFRAME提供頁面內容到 另一個系統。用戶 將登錄到其他系統並且 該系統將他們的aKeyKey和 userKey設置在我係統上的cookie中,因此 訪問將被授予我的 系統。我想要加密這些值 ,以便惡意用戶不能通過修改值授權訪問某人的系統 系統。有沒有 良好的.NET標準這種類型的 加密/安全?你在這種情況下推薦我做什麼 ?如何生成散列或使用加密來保護asp.net mvc應用程序中的密鑰?

大家好,首先 這可能會被問過,但我從來沒有實現散列或加密之前,所以我只是想確保我把我的觀點跨越clearly.I想有什麼需要一些好主意在這裏完成。

我有幾個鍵對用戶來說是唯一的,並且通過iframes被客戶端傳遞,並且爲了保持會話我們使用這些值爲他們創建cookie。因此,現在我想要爲這些值加密或生成散列因爲它們在url中可見我不希望用戶操作這些值。

所以,我想我想爲這兩個鍵生成一個散列,並在瀏覽器中顯示它以阻止用戶輸入一些隨機值並嘗試濫用系統。我猜會將這些哈希值存儲在數據庫中,然後與原始值進行比較。

請大家指導一下我所需要做的和我應該用什麼來實現它的步驟。

回答

2

首先,如果我正確理解你的場景,你不需要哈希,但你需要加密這些密鑰。如果您對它們進行哈希處理,您將永遠無法讀取原始值並創建會話cookie。你正試圖實現跨域單點登錄(如果這不是你的情況,我誤解了你的情況,你可以忽略我的答案的其餘部分)。

我會使用機器密鑰來加密建議你/解密:

加密:

var ticket = new FormsAuthenticationTicket(
    1, // version 
    "ticketName", // name of the ticket (it doesn't really matter here) 
    DateTime.Now, // issue date 
    DateTime.Now.AddMinutes(1), // validity of the ticket 
    false, // should the ticket be persistent 
    "key1=value1&key2=value2......" // values to encrypt, could be any string 
); 
string encrypted = FormsAuthentication.Encrypt(ticket); 

現在發送加密的字符串在電線上。另一方面解密。

var ticket = FormsAuthentication.Decrypt(encrypted); 
if (!ticket.Expired) 
{ 
    // The ticket hasn't expired (< 1min) => use the values 
    string keys = ticket.UserData; 
    // TODO: Parse and issue cookie 
} 

對於這項工作,有必要:使用SSL來避免一個人在這方面的中間人誰可以竊取加密值,並嘗試蠻力通過加密通道進行這一點,是很重要的在加密和解密端都有相同的machine keys


UPDATE:

步驟如下:

  1. 上系統A(域1)
  2. 系統A決定的iframe中系統B包括該用戶被認證(域2)用戶未通過認證
  3. 系統A使用機器密鑰生成包含用戶信息的加密字符串
  4. 系統A(經由iframe的src屬性)此加密值
  5. 系統B讀取並解密包含用戶信息的加密的值發送到系統B
  6. 系統B發出認證Cookie來指示用戶是現在認證的域2
  7. 系統B顯示了身份驗證的內容,您對實現跨域單點登錄用戶

。當然,這種技術不僅限於iframe。

+0

已更新我的問題..謝謝您的回覆。 – Vishal 2010-08-31 17:29:26

+0

編輯之後,似乎您描述的場景就是我在我的答案中提出的解決方案。 – 2010-08-31 17:52:38

2

你說你的數據庫是存儲沿着這些線路是專用於特定用戶的信息,東西:

{ID = 1,USER =鮑勃}
{ID = 2,用戶=鮑勃}
{ID = 3,用戶=佛瑞德}
{ID = 4時,用戶=鮑勃}
{ID = 5,用戶=蘇珊}

如果是這種情況,則它會看似意義不加密URL中的ID,但要驗證用戶實際上是否有權訪問他所在的數據試圖查看。例如,如果Fred登錄並嘗試訪問?id = 2,則系統會檢測到他沒有訪問權限並返回錯誤頁面。但是如果Bob登錄,他可以訪問?id = 2就好了。您可以通過在DB表中添加一個額外的列來指定擁有該特定行的用戶。在這種特殊情況下,ID本身並不敏感,因此您不需要對其進行加密或混淆。

如果我誤解了你的情況,請澄清。 :)

+0

更新我的問題..謝謝你的迴應。 – Vishal 2010-08-31 17:31:10

2

恐怕我不清楚你的場景的細節,但我可以說,一般來說,你要找的就是你傳遞的數據的「完整性」。

這可以通過消息認證碼提供,就像HMAC算法一樣。在這裏,共享密鑰與數據結合並迭代散列。結果與數據一起發送。知道共享密鑰的接收者可以對數據執行相同的過程,並查看他們的結果是否與提供的MAC匹配。如果不是,數據僞造或更改。

不要試圖自己實現HMAC算法。 .NET class library提供了該算法的一些變體。

+0

已更新我的問題..感謝您的回覆。 – Vishal 2010-08-31 17:30:50

+0

@Misnomer - 謝謝澄清。我認爲MAC可能仍然有用。它將阻止用戶簡單地輸入某人的用戶名並嘗試僞造他們的身份。 (MAC提供與數字簽名類似的功能,但它使用共享密鑰而不是公用密鑰。)但是,其他系統也必須實現HMAC功能,這可能不切實際。另一個警告是,雖然令牌防篡改,但它們可以被複制和重複使用。需要合併某種隨機數(一個唯一的ID)以防止這種情況發生。 – erickson 2010-08-31 17:57:52

1

如果我理解yoru問題是正確的,我認爲你會以錯誤的方式去做這件事。您的應用程序應該以這樣的方式製作,即與查詢字符串或發佈的數據混淆不應該能夠繞過您的安全。

提供數據純文本,應該無關緊要,如果您的安全性正確完成。通過使用哈希,加密或任何其他方法來「隱藏」這些數據只是再次保護最基本的用戶。

分析爲什麼要保護查詢字符串以及哪些部分是重要的。然後驗證服務器端(控制器)上的數據以確保每個動作確實正確...除此之外,無論你認爲你的查詢字符串加密/晦澀是多麼的安全,你都可以隨意操縱它。

+0

已更新我的問題..感謝您的回覆。 – Vishal 2010-08-31 17:30:29