用ASP.NET加密Cookie數(shù)據(jù)(圖)
發(fā)布日期:2022-01-07 19:01 | 文章來(lái)源:站長(zhǎng)之家
Cookie確實(shí)在WEB應(yīng)用方面為訪問(wèn)者和編程者都提供了方便,然而從安全方面考慮是有問(wèn)題的,首先,Cookie數(shù)據(jù)包含在HTTP請(qǐng)求和響應(yīng)的包頭里透明地傳遞,也就是說(shuō)聰明的人是能清清楚楚看到這些數(shù)據(jù)的。其次,Cookie數(shù)據(jù)以Cookie文件格式存儲(chǔ)在瀏覽者計(jì)算機(jī)的cache目錄里,其中就包含有關(guān)網(wǎng)頁(yè)、密碼和其他用戶(hù)行為的信息,那么只要進(jìn)入硬盤(pán)就能打開(kāi)Cookie文件。圖1是一個(gè)Cookie文件的內(nèi)容:
如果你未曾留意你的機(jī)器里有Cookie文件,可以按下列方法查看:打開(kāi)IE,選擇“工具”菜單里的“Internet選項(xiàng)”,然后在彈出的對(duì)話(huà)框里點(diǎn)擊“設(shè)置”按鈕,在設(shè)置對(duì)話(huà)框里點(diǎn)擊“查看”鈕,就會(huì)打開(kāi)一個(gè)窗口顯示瀏覽器放在硬盤(pán)里的所有緩存數(shù)據(jù),其中就有大量的Cookie文件。
所以奉勸大家不要將敏感的用戶(hù)數(shù)據(jù)存放在Cookie中,要么就通過(guò)加密將這些數(shù)據(jù)保護(hù)起來(lái)。
在以前的ASP版本中沒(méi)有加密的功能,現(xiàn)在.NET構(gòu)架在System.Security.Cryptography命名空間里提供了許多加密類(lèi)可以利用。
一、.NET的密碼系統(tǒng)概要
簡(jiǎn)單地說(shuō),加密就是將原始字符(字節(jié))串轉(zhuǎn)變?yōu)橥耆煌淖址奶幚磉^(guò)程,達(dá)到原始字符無(wú)法破譯的目的。這個(gè)處理過(guò)程是用另一個(gè)字符串(稱(chēng)為“密鑰”),采取復(fù)雜的、混合的算法,“搗進(jìn)”原始字符串。有時(shí)還使用一個(gè)稱(chēng)為“初始向量”的字符串,在密鑰搗進(jìn)之前先打亂目標(biāo)字符串,預(yù)防目標(biāo)字符串中較明顯的內(nèi)容被識(shí)破。加密的功效取決于所用密鑰的大小,密鑰越長(zhǎng),保密性越強(qiáng)。典型的密鑰長(zhǎng)度有64位、128位、192位、256位和512位。攻擊者唯一的方法是創(chuàng)建一個(gè)程序嘗試每一個(gè)可能的密鑰組合,但64位密鑰也有72,057,594,037,927,936種組合。
目前有兩種加密方法:對(duì)稱(chēng)加密(或稱(chēng)私有密鑰)和非對(duì)稱(chēng)加密(或稱(chēng)公共密鑰)。對(duì)稱(chēng)加密技術(shù)的數(shù)據(jù)交換兩邊(即加密方和解密方)必須使用一個(gè)保密的私有密鑰。非對(duì)稱(chēng)加密技術(shù)中,解密方向加密方要求一個(gè)公共密鑰,加密方在建立一個(gè)公共密鑰給解密方后,用公共密鑰創(chuàng)建唯一的私有密鑰。加密方用私有密鑰加密送出的信息,對(duì)方用公共密鑰解密。保護(hù)HTTP傳輸安全的SSL就是使用非對(duì)稱(chēng)技術(shù)。
我們對(duì)Cookie數(shù)據(jù)的加密采取對(duì)稱(chēng)加密法。.NET構(gòu)架從基本的SymmetricAlgorithm類(lèi)擴(kuò)展出來(lái)四種算法:
·System.Security.Cryptography.DES
·System.Security.Cryptography.TripleDES
·System.Security.Cryptography.RC2
·System.Security.Cryptography.Rijndael
下面將示范DES和TripleDES算法。DES的密鑰大小限制在64位,但用于Cookie的加密是有效的。TripleDES完成了三次加密,并有一個(gè)較大的密鑰位數(shù),所以它更安全。使用那一種算法不僅要考慮加密強(qiáng)度,還要考慮Cookie的大小。因?yàn)榧用芎蟮腃ookie數(shù)據(jù)將變大,并且,密鑰越大,加密后的數(shù)據(jù)就越大,然而Cookie數(shù)據(jù)的大小限制在4KB,這是一個(gè)必須考慮的問(wèn)題。再者,加密的數(shù)據(jù)越多或算法越復(fù)雜,就會(huì)占有更多的服務(wù)器資源,進(jìn)而減慢整個(gè)站點(diǎn)的訪問(wèn)速度。
二、創(chuàng)建一個(gè)簡(jiǎn)單的加密應(yīng)用類(lèi)
.NET的所有加密和解密通過(guò)CryptoStream類(lèi)別來(lái)處理,它衍生自System.IO.Stream,將字符串作為以資料流為基礎(chǔ)的模型,供加密轉(zhuǎn)換之用。下面是一個(gè)簡(jiǎn)單的加密應(yīng)用類(lèi)的代碼:
Imports System.Diagnostics
Imports System.Security.Cryptography
Imports System.Text
Imports System.IO
Public Class CryptoUtil
'隨機(jī)選8個(gè)字節(jié)既為密鑰也為初始向量
Private Shared KEY_64() As Byte = {42, 16, 93, 156, 78, 4, 218, 32}
Private Shared IV_64() As Byte = {55, 103, 246, 79, 36, 99, 167, 3}
'對(duì)TripleDES,采取24字節(jié)或192位的密鑰和初始向量
Private Shared KEY_192() As Byte = {42, 16, 93, 156, 78, 4, 218, 32, _
15, 167, 44, 80, 26, 250, 155, 112, _
2, 94, 11, 204, 119, 35, 184, 197}
Private Shared IV_192() As Byte = {55, 103, 246, 79, 36, 99, 167, 3, _
42, 5, 62, 83, 184, 7, 209, 13, _
145, 23, 200, 58, 173, 10, 121, 222}
'標(biāo)準(zhǔn)的DES加密
Public Shared Function Encrypt(ByVal value As String) As String
If value "" Then
Dim cryptoProvider As DESCryptoServiceProvider = _
New DESCryptoServiceProvider()
Dim ms As MemoryStream = New MemoryStream()
Dim cs As CryptoStream = _
New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), _
CryptoStreamMode.Write)
Dim sw As StreamWriter = New StreamWriter(cs)
sw.Write(value)
sw.Flush()
cs.FlushFinalBlock()
ms.Flush()
'再轉(zhuǎn)換為一個(gè)字符串
Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
End If
End Function
'標(biāo)準(zhǔn)的DES解密
Public Shared Function Decrypt(ByVal value As String) As String
If value "" Then
Dim cryptoProvider As DESCryptoServiceProvider = _
New DESCryptoServiceProvider()
'從字符串轉(zhuǎn)換為字節(jié)組
Dim buffer As Byte() = Convert.FromBase64String(value)
Dim ms As MemoryStream = New MemoryStream(buffer)
Dim cs As CryptoStream = _
New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_64, IV_64), _
CryptoStreamMode.Read)
Dim sr As StreamReader = New StreamReader(cs)
Return sr.ReadToEnd()
End If
如果你未曾留意你的機(jī)器里有Cookie文件,可以按下列方法查看:打開(kāi)IE,選擇“工具”菜單里的“Internet選項(xiàng)”,然后在彈出的對(duì)話(huà)框里點(diǎn)擊“設(shè)置”按鈕,在設(shè)置對(duì)話(huà)框里點(diǎn)擊“查看”鈕,就會(huì)打開(kāi)一個(gè)窗口顯示瀏覽器放在硬盤(pán)里的所有緩存數(shù)據(jù),其中就有大量的Cookie文件。
所以奉勸大家不要將敏感的用戶(hù)數(shù)據(jù)存放在Cookie中,要么就通過(guò)加密將這些數(shù)據(jù)保護(hù)起來(lái)。
在以前的ASP版本中沒(méi)有加密的功能,現(xiàn)在.NET構(gòu)架在System.Security.Cryptography命名空間里提供了許多加密類(lèi)可以利用。
一、.NET的密碼系統(tǒng)概要
簡(jiǎn)單地說(shuō),加密就是將原始字符(字節(jié))串轉(zhuǎn)變?yōu)橥耆煌淖址奶幚磉^(guò)程,達(dá)到原始字符無(wú)法破譯的目的。這個(gè)處理過(guò)程是用另一個(gè)字符串(稱(chēng)為“密鑰”),采取復(fù)雜的、混合的算法,“搗進(jìn)”原始字符串。有時(shí)還使用一個(gè)稱(chēng)為“初始向量”的字符串,在密鑰搗進(jìn)之前先打亂目標(biāo)字符串,預(yù)防目標(biāo)字符串中較明顯的內(nèi)容被識(shí)破。加密的功效取決于所用密鑰的大小,密鑰越長(zhǎng),保密性越強(qiáng)。典型的密鑰長(zhǎng)度有64位、128位、192位、256位和512位。攻擊者唯一的方法是創(chuàng)建一個(gè)程序嘗試每一個(gè)可能的密鑰組合,但64位密鑰也有72,057,594,037,927,936種組合。
目前有兩種加密方法:對(duì)稱(chēng)加密(或稱(chēng)私有密鑰)和非對(duì)稱(chēng)加密(或稱(chēng)公共密鑰)。對(duì)稱(chēng)加密技術(shù)的數(shù)據(jù)交換兩邊(即加密方和解密方)必須使用一個(gè)保密的私有密鑰。非對(duì)稱(chēng)加密技術(shù)中,解密方向加密方要求一個(gè)公共密鑰,加密方在建立一個(gè)公共密鑰給解密方后,用公共密鑰創(chuàng)建唯一的私有密鑰。加密方用私有密鑰加密送出的信息,對(duì)方用公共密鑰解密。保護(hù)HTTP傳輸安全的SSL就是使用非對(duì)稱(chēng)技術(shù)。
我們對(duì)Cookie數(shù)據(jù)的加密采取對(duì)稱(chēng)加密法。.NET構(gòu)架從基本的SymmetricAlgorithm類(lèi)擴(kuò)展出來(lái)四種算法:
·System.Security.Cryptography.DES
·System.Security.Cryptography.TripleDES
·System.Security.Cryptography.RC2
·System.Security.Cryptography.Rijndael
下面將示范DES和TripleDES算法。DES的密鑰大小限制在64位,但用于Cookie的加密是有效的。TripleDES完成了三次加密,并有一個(gè)較大的密鑰位數(shù),所以它更安全。使用那一種算法不僅要考慮加密強(qiáng)度,還要考慮Cookie的大小。因?yàn)榧用芎蟮腃ookie數(shù)據(jù)將變大,并且,密鑰越大,加密后的數(shù)據(jù)就越大,然而Cookie數(shù)據(jù)的大小限制在4KB,這是一個(gè)必須考慮的問(wèn)題。再者,加密的數(shù)據(jù)越多或算法越復(fù)雜,就會(huì)占有更多的服務(wù)器資源,進(jìn)而減慢整個(gè)站點(diǎn)的訪問(wèn)速度。
二、創(chuàng)建一個(gè)簡(jiǎn)單的加密應(yīng)用類(lèi)
.NET的所有加密和解密通過(guò)CryptoStream類(lèi)別來(lái)處理,它衍生自System.IO.Stream,將字符串作為以資料流為基礎(chǔ)的模型,供加密轉(zhuǎn)換之用。下面是一個(gè)簡(jiǎn)單的加密應(yīng)用類(lèi)的代碼:
Imports System.Diagnostics
Imports System.Security.Cryptography
Imports System.Text
Imports System.IO
Public Class CryptoUtil
'隨機(jī)選8個(gè)字節(jié)既為密鑰也為初始向量
Private Shared KEY_64() As Byte = {42, 16, 93, 156, 78, 4, 218, 32}
Private Shared IV_64() As Byte = {55, 103, 246, 79, 36, 99, 167, 3}
'對(duì)TripleDES,采取24字節(jié)或192位的密鑰和初始向量
Private Shared KEY_192() As Byte = {42, 16, 93, 156, 78, 4, 218, 32, _
15, 167, 44, 80, 26, 250, 155, 112, _
2, 94, 11, 204, 119, 35, 184, 197}
Private Shared IV_192() As Byte = {55, 103, 246, 79, 36, 99, 167, 3, _
42, 5, 62, 83, 184, 7, 209, 13, _
145, 23, 200, 58, 173, 10, 121, 222}
'標(biāo)準(zhǔn)的DES加密
Public Shared Function Encrypt(ByVal value As String) As String
If value "" Then
Dim cryptoProvider As DESCryptoServiceProvider = _
New DESCryptoServiceProvider()
Dim ms As MemoryStream = New MemoryStream()
Dim cs As CryptoStream = _
New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), _
CryptoStreamMode.Write)
Dim sw As StreamWriter = New StreamWriter(cs)
sw.Write(value)
sw.Flush()
cs.FlushFinalBlock()
ms.Flush()
'再轉(zhuǎn)換為一個(gè)字符串
Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
End If
End Function
'標(biāo)準(zhǔn)的DES解密
Public Shared Function Decrypt(ByVal value As String) As String
If value "" Then
Dim cryptoProvider As DESCryptoServiceProvider = _
New DESCryptoServiceProvider()
'從字符串轉(zhuǎn)換為字節(jié)組
Dim buffer As Byte() = Convert.FromBase64String(value)
Dim ms As MemoryStream = New MemoryStream(buffer)
Dim cs As CryptoStream = _
New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_64, IV_64), _
CryptoStreamMode.Read)
Dim sr As StreamReader = New StreamReader(cs)
Return sr.ReadToEnd()
End If
上一頁(yè)12 下一頁(yè) 閱讀全文
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章
上一篇:
破別人ASP木馬密碼的方法
下一篇:
關(guān)注官方微信