Cookie确实在WEB应用方面为访问者和编程者都提供了方便然而从安全方面考虑是有问题的首先Cookie数据包含在HTTP请求和响应的包头里透明地传递也就是说聪明的人是能清清楚楚看到这些数据的
其次Cookie数据以Cookie文件格式存储在浏览者计算机的cache目录里其中就包含有关网页密码和其他用户行为的信息那么只要进入硬盘就能打开Cookie文件图是一个Cookie文件的内容
如果你未曾留意你的机器里有Cookie文件可以按下列方法查看打开IE选择工具菜单里的Internet选项然后在弹出的对话框里点击设置按钮在设置对话框里点击查看钮就会打开一个窗口显示浏览器放在硬盘里的所有缓存数据其中就有大量的Cookie文件
所以奉劝大家不要将敏感的用户数据存放在Cookie中要么就通过加密将这些数据保护起来
在以前的ASP版本中没有加密的功能现在NET构架在SystemSecurityCryptography命名空间里提供了许多加密类可以利用
一NET的密码系统概要
简单地说加密就是将原始字符(字节)串转变为完全不同的字符串的处理过程达到原始字符无法破译的目的这个处理过程是用另一个字符串(称为密钥)采取复杂的混合的算法捣进原始字符串有时还使用一个称为初始向量的字符串在密钥捣进之前先打乱目标字符串预防目标字符串中较明显的内容被识破加密的功效取决于所用密钥的大小密钥越长保密性越强典型的密钥长度有位位位位和位攻击者唯一的方法是创建一个程序尝试每一个可能的密钥组合但位密钥也有种组合
目前有两种加密方法对称加密(或称私有密钥)和非对称加密(或称公共密钥)对称加密技术的数据交换两边(即加密方和解密方)必须使用一个保密的私有密钥非对称加密技术中解密方向加密方要求一个公共密钥加密方在建立一个公共密钥给解密方后用公共密钥创建唯一的私有密钥加密方用私有密钥加密送出的信息对方用公共密钥解密保护HTTP传输安全的SSL就是使用非对称技术
我们对Cookie数据的加密采取对称加密法NET构架从基本的SymmetricAlgorithm类扩展出来四种算法
·SystemSecurityCryptographyDES
·SystemSecurityCryptographyTripleDES
·SystemSecurityCryptographyRC
·SystemSecurityCryptographyRijndael
下面将示范DES和TripleDES算法DES的密钥大小限制在位但用于Cookie的加密是有效的TripleDES完成了三次加密并有一个较大的密钥位数所以它更安全使用那一种算法不仅要考虑加密强度还要考虑Cookie的大小因为加密后的Cookie数据将变大并且密钥越大加密后的数据就越大然而Cookie数据的大小限制在KB这是一个必须考虑的问题再者加密的数据越多或算法越复杂就会占有更多的服务器资源进而减慢整个站点的访问速度
二创建一个简单的加密应用类
NET的所有加密和解密通过CryptoStream类别来处理它衍生自SystemIOStream将字符串作为以资料流为基础的模型供加密转换之用下面是一个简单的加密应用类的代码
Imports SystemDiagnostics
Imports SystemSecurityCryptography
Imports SystemText
Imports SystemIO
Public Class CryptoUtil
随机选个字节既为密钥也为初始向量
Private Shared KEY_() As Byte = { }
Private Shared IV_() As Byte = { }
对TripleDES采取字节或位的密钥和初始向量
Private Shared KEY_() As Byte = { _
_
}
Private Shared IV_() As Byte = { _
_
}
标准的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 cryptoProviderCreateEncryptor(KEY_ IV_) _
CryptoStreamModeWrite)
Dim sw As StreamWriter = New StreamWriter(cs)
swWrite(value)
swFlush()
csFlushFinalBlock()
msFlush()
再转换为一个字符串
Return ConvertToBaseString(msGetBuffer() msLength)
End If
End Function
标准的DES解密
Public Shared Function Decrypt(ByVal value As String) As String
If value <> Then
Dim cryptoProvider As DESCryptoServiceProvider = _
New DESCryptoServiceProvider()
从字符串转换为字节组
Dim buffer As Byte() = ConvertFromBaseString(value)
Dim ms As MemoryStream = New MemoryStream(buffer)
Dim cs As CryptoStream = _
New CryptoStream(ms cryptoProviderCreateDecryptor(KEY_ IV_) _
CryptoStreamModeRead)
Dim sr As StreamReader = New StreamReader(cs)
Return srReadToEnd()
End If
End Function
TRIPLE DES加密
Public Shared Function EncryptTripleDES(ByVal value As String) As String
If value <> Then
Dim cryptoProvider As TripleDESCryptoServiceProvider = _
New TripleDESCryptoServiceProvider()
Dim ms As MemoryStream = New MemoryStream()
Dim cs As CryptoStream = _
New CryptoStream(ms cryptoProviderCreateEncryptor(KEY_ IV_) _
CryptoStreamModeWrite)
Dim sw As StreamWriter = New StreamWriter(cs)
swWrite(value)
swFlush()
csFlushFinalBlock()
msFlush()
再转换为一个字符串
Return ConvertToBaseString(msGetBuffer() msLength)
End If
End Function
TRIPLE DES解密
Public Shared Function DecryptTripleDES(ByVal value As String) As String
If value <> Then
Dim cryptoProvider As TripleDESCryptoServiceProvider = _
New TripleDESCryptoServiceProvider()
从字符串转换为字节组
Dim buffer As Byte() = ConvertFromBaseString(value)
Dim ms As MemoryStream = New MemoryStream(buffer)
Dim cs As CryptoStream = _
New CryptoStream(ms cryptoProviderCreateDecryptor(KEY_ IV_) _
CryptoStreamModeRead)
Dim sr As StreamReader = New StreamReader(cs)
Return srReadToEnd()
End If
End Function
End Class
上面我们将一组字节初始化为密钥并且使用的是数字常量如果你在实际应用中也这样做这些字节一定要在和之间这是一个字节允许的范围值
三创建一个Cookie的应用类
下面我们就创建一个简单的类来设置和获取Cookies
Public Class CookieUtil
设置COOKIE *****************************************************
SetTripleDESEncryptedCookie (只针对密钥和Cookie数据)
Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String _
ByVal value As String)
key = CryptoUtilEncryptTripleDES(key)
value = CryptoUtilEncryptTripleDES(value)
SetCookie(key value)
End Sub
SetTripleDESEncryptedCookie (增加了Cookie数据的有效期参数)
Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String _
ByVal value As String ByVal expires A