189
技術社區[雲棲]
用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