Cookie确实在WEB应用方面为访问者和编程者都提供了方便,然而从安全方面考虑是有问题的
首先,Cookie数据会随着HTTP请求和响应的包头进行明文传输,这意味着在传输过程中,这些数据可能被第三方截获和查看。其次,Cookie通常以文本文件的形式存储在用户的浏览器缓存目录中,其中可能包含用户的会话信息、登录凭证甚至浏览历史。换句话说,只要能访问到用户的存储设备,这些Cookie文件就可能被读取。图1展示了一个典型的Cookie文件内容:
500)this.width=500" title="点击这里用新窗口浏览图片" />
如果您从未检查过计算机中的Cookie文件,可以按照以下步骤查看:启动Internet Explorer浏览器,点击“工具”菜单并选择“Internet选项”,在弹出的对话框中点击“设置”按钮,接着在“网站数据设置”窗口中点击“查看文件”,即可打开一个文件夹,其中列出了浏览器存储的所有缓存数据,您可以在其中找到大量的Cookie文件。
因此,一个重要的安全建议是:避免将敏感的用户信息直接存储在Cookie中。如果业务上必须存储,至少应使用可靠的加密技术对这些数据进行保护。
在早期的ASP版本中,内置的加密功能较为有限。而现在,.NET框架在System.Security.Cryptography命名空间下,为开发者提供了一系列功能强大的加密类,可以轻松实现数据的安全处理。
一、.NET的密码系统概要
简单来说,加密是将原始数据(通常为字节序列)通过特定算法和密钥,转换为一串不可读的密文的过程。这个过程的核心是依赖一个称为“密钥”的秘密字符串,通过复杂的数学运算对数据进行混淆。有时还会引入一个“初始化向量”(IV)来进一步增强安全性,它在加密开始前先打乱数据的结构,以防止攻击者识别出明文中的固定模式。加密的强度在很大程度上取决于密钥的长度——密钥越长,破解的难度就呈指数级增长。常见的密钥长度包括64位、128位、192位、256位和512位。例如,面对一个64位的密钥,攻击者理论上需要进行多达2^64次尝试,这是一个极其庞大的数字。
目前主流的加密方法主要分为两类:对称加密(也称为私钥加密)和非对称加密(也称为公钥加密)。对称加密要求通信的加密方和解密方共享同一个秘密密钥。而非对称加密则使用一对密钥:一个公开的公钥用于加密,一个保密的私钥用于解密。我们熟悉的、用于保障网站通信安全的SSL/TLS协议,其核心就采用了非对称加密技术。
对于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算法本质上是将DES算法应用三次,并支持更长的密钥(如192位),因此安全性显著更高。那么,在实际项目中如何选择算法呢?这不仅仅是安全性的权衡,还需要考虑加密后的数据体积。因为加密过程会导致数据膨胀,且密钥越长,膨胀可能越明显。请务必注意,浏览器对单个Cookie的大小通常有4KB的限制。此外,需要加密的数据量越大,或算法越复杂,消耗的服务器计算资源就越多,可能对网站性能产生影响。
二、创建一个简单的加密应用类
.NET框架中所有的加密和解密操作,都可以通过CryptoStream类以流式的方式优雅地完成。该类继承自System.IO.Stream,将数据视为字节流,并在该流上应用加密转换。下面是一个用VB.NET编写的简易加密工具类示例:
Imports System.Diagnostics
Imports System.Security.Cryptography
Imports System.Text
Imports System.IO
Public Class CryptoUtil
'随机选8个字节既为密钥也为初始向量
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}
'对TripleDES,采取24字节或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}
'标准的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()
'再转换为一个字符串
Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
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() = 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
上一页12 下一页 阅读全文
