閱讀189 返回首頁    go 技術社區[雲棲]


用ASP.NET加密Cookie數據

Cookie確實在WEB應用方麵為訪問者和編程者都提供了方便,然而從安全方麵考慮是有問題的,首先,Cookie數據包含在HTTP請求和響應的包頭裏透明地傳遞,也就是說聰明的人是能清清楚楚看到這些數據的
。其次,Cookie數據以Cookie文件格式存儲在瀏覽者計算機的cache目錄裏,其中就包含有關網頁、密碼和其他用戶行為的信息,那麼隻要進入硬盤就能打開Cookie文件。圖1是一個Cookie文件的內容:

如果你未曾留意你的機器裏有Cookie文件,可以按下列方法查看:打開IE,選擇“工具”菜單裏的“Internet選項”,然後在彈出的對話框裏點擊“設置”按鈕,在設置對話框裏點擊“查看”鈕,就會打開一個窗口顯示瀏覽器放在硬盤裏的所有緩存數據,其中就有大量的Cookie文件。

所以奉勸大家不要將敏感的用戶數據存放在Cookie中,要麼就通過加密將這些數據保護起來。

在以前的ASP版本中沒有加密的功能,現在.NET構架在System.Security.Cryptography命名空間裏提供了許多加密類可以利用。

 

一、.NET的密碼係統概要

簡單地說,加密就是將原始字符(字節)串轉變為完全不同的字符串的處理過程,達到原始字符無法破譯的目的。這個處理過程是用另一個字符串(稱為“密鑰”),采取複雜的、混合的算法,“搗進”原始字符串。有時還使用一個稱為“初始向量”的字符串,在密鑰搗進之前先打亂目標字符串,預防目標字符串中較明顯的內容被識破。加密的功效取決於所用密鑰的大小,密鑰越長,保密性越強。典型的密鑰長度有64位、128位、192位、256位和512位。攻擊者唯一的方法是創建一個程序嚐試每一個可能的密鑰組合,但64位密鑰也有72,057,594,037,927,936種組合。

目前有兩種加密方法:對稱加密(或稱私有密鑰)和非對稱加密(或稱公共密鑰)。對稱加密技術的數據交換兩邊(即加密方和解密方)必須使用一個保密的私有密鑰。非對稱加密技術中,解密方向加密方要求一個公共密鑰,加密方在建立一個公共密鑰給解密方後,用公共密鑰創建唯一的私有密鑰。加密方用私有密鑰加密送出的信息,對方用公共密鑰解密。保護HTTP傳輸安全的SSL就是使用非對稱技術。

我們對Cookie數據的加密采取對稱加密法。.NET構架從基本的SymmetricAlgorithm類擴展出來四種算法:

·System.Security.Cryptography.DES

·System.Security.Cryptography.TripleDES

·System.Security.Cryptography.RC2

·System.Security.Cryptography.Rijndael

下麵將示範DES和TripleDES算法。DES的密鑰大小限製在64位,但用於Cookie的加密是有效的。TripleDES完成了三次加密,並有一個較大的密鑰位數,所以它更安全。使用那一種算法不僅要考慮加密強度,還要考慮Cookie的大小。因為加密後的Cookie數據將變大,並且,密鑰越大,加密後的數據就越大,然而Cookie數據的大小限製在4KB,這是一個必須考慮的問題。再者,加密的數據越多或算法越複雜,就會占有更多的服務器資源,進而減慢整個站點的訪問速度。

二、創建一個簡單的加密應用類

.NET的所有加密和解密通過CryptoStream類別來處理,它衍生自System.IO.Stream,將字符串作為以資料流為基礎的模型,供加密轉換之用。下麵是一個簡單的加密應用類的代碼:

ImportsSystem.Diagnostics

ImportsSystem.Security.Cryptography

ImportsSystem.Text

ImportsSystem.IO


PublicClassCryptoUtil


'隨機選8個字節既為密鑰也為初始向量

PrivateSharedKEY_64()AsByte={42,16,93,156,78,4,218,32}

PrivateSharedIV_64()AsByte={55,103,246,79,36,99,167,3}


'對TripleDES,采取24字節或192位的密鑰和初始向量

PrivateSharedKEY_192()AsByte={42,16,93,156,78,4,218,32,_

15,167,44,80,26,250,155,112,_

2,94,11,204,119,35,184,197}

PrivateSharedIV_192()AsByte={55,103,246,79,36,99,167,3,_

42,5,62,83,184,7,209,13,_

145,23,200,58,173,10,121,222}


'標準的DES加密

PublicSharedFunctionEncrypt(ByValvalueAsString)AsString

Ifvalue<>""Then

DimcryptoProviderAsDESCryptoServiceProvider=_

NewDESCryptoServiceProvider()

DimmsAsMemoryStream=NewMemoryStream()

DimcsAsCryptoStream=_

NewCryptoStream(ms,cryptoProvider.CreateEncryptor(KEY_64,IV_64),_

CryptoStreamMode.Write)

DimswAsStreamWriter=NewStreamWriter(cs)


sw.Write(value)

sw.Flush()

cs.FlushFinalBlock()

ms.Flush()


'再轉換為一個字符串

ReturnConvert.ToBase64String(ms.GetBuffer(),0,ms.Length)

EndIf

EndFunction



'標準的DES解密

PublicSharedFunctionDecrypt(ByValvalueAsString)AsString

Ifvalue<>""Then

DimcryptoProviderAsDESCryptoServiceProvider=_

NewDESCryptoServiceProvider()


'從字符串轉換為字節組

DimbufferAsByte()=Convert.FromBase64String(value)

DimmsAsMemoryStream=NewMemoryStream(buffer)

DimcsAsCryptoStream=_

NewCryptoStream(ms,cryptoProvider.CreateDecryptor(KEY_64,IV_64),_

CryptoStreamMode.Read)

DimsrAsStreamReader=NewStreamReader(cs)


Returnsr.ReadToEnd()

EndIf

EndFunction


'TRIPLEDES加密

PublicSharedFunctionEncryptTripleDES(ByValvalueAsString)AsString

Ifvalue<>""Then

DimcryptoProviderAsTripleDESCryptoServiceProvider=_

NewTripleDESCryptoServiceProvider()

DimmsAsMemoryStream=NewMemoryStream()

DimcsAsCryptoStream=_

NewCryptoStream(ms,cryptoProvider.CreateEncryptor(KEY_192,IV_192),_

CryptoStreamMode.Write)

DimswAsStreamWriter=NewStreamWriter(cs)


sw.Write(value)

sw.Flush()

cs.FlushFinalBlock()

ms.Flush()


'再轉換為一個字符串

ReturnConvert.ToBase64String(ms.GetBuffer(),0,ms.Length)

EndIf

EndFunction



'TRIPLEDES解密

PublicSharedFunctionDecryptTripleDES(ByValvalueAsString)AsString

Ifvalue<>""Then

DimcryptoProviderAsTripleDESCryptoServiceProvider=_

NewTripleDESCryptoServiceProvider()


'從字符串轉換為字節組

DimbufferAsByte()=Convert.FromBase64String(value)

DimmsAsMemoryStream=NewMemoryStream(buffer)

DimcsAsCryptoStream=_

NewCryptoStream(ms,cryptoProvider.CreateDecryptor(KEY_192,IV_192),_

CryptoStreamMode.Read)

DimsrAsStreamReader=NewStreamReader(cs)


Returnsr.ReadToEnd()

EndIf

EndFunction


EndClass

上麵我們將一組字節初始化為密鑰,並且使用的是數字常量,如果你在實際應用中也這樣做,這些字節一定要在0和255之間,這是一個字節允許的範圍值。

三、創建一個Cookie的應用類

下麵我們就創建一個簡單的類,來設置和獲取Cookies。

PublicClassCookieUtil


'設置COOKIE*****************************************************


'SetTripleDESEncryptedCookie(隻針對密鑰和Cookie數據)

PublicSharedSubSetTripleDESEncryptedCookie(ByValkeyAsString,_

ByValvalueAsString)

key=CryptoUtil.EncryptTripleDES(key)

value=CryptoUtil.EncryptTripleDES(value)


SetCookie(key,value)

EndSub


'SetTripleDESEncryptedCookie(增加了Cookie數據的有效期參數)

PublicSharedSubSetTripleDESEncryptedCookie(ByValkeyAsString,_

ByValvalueAsString,ByValexpiresA

最後更新:2017-04-02 00:06:30

  上一篇:go asp.net的MVC編程、MV編程以及URL重寫
  下一篇:go ASP.NET操作IIS中的虛擬目錄