【转】用ASP.NET加密Cookie数据

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 来源:http://www.cnblogs.com/taizhouxiaoba/archive/2009/02/05/1384772.html Cookie中的数据以文本的形式存在客户端计算机,考虑它的安全性,最好在将数据存入Cookie之前对其进行加密。

来源:http://www.cnblogs.com/taizhouxiaoba/archive/2009/02/05/1384772.html

Cookie中的数据以文本的形式存在客户端计算机,考虑它的安全性,最好在将数据存入Cookie之前对其进行加密。
加密的方法很多,比较简单一点的有:Base64,md5,sha等,而相对比较复杂一点的有:DES,TripleDES,RC2,Rijndael等。
下面是的代码实现了将数据存入Cookie之前采用散列的算法进行加密.

1 Private   void   Login_Click(object   sender,System   EventArgs   e) 
2 { 
3     string   Name   =   NameBox.Text; 
4     string   Pass   =   PassBox.Text; 
5     Response.Cookies["name"].Value   =   FormsAuthentication.HashPasswordForStoringInConfigFile(Name,   "md5"); 
6     Response.Cookies["pass"].Value   =   FormsAuthentication.HashPasswordForStoringInConfigFile(Pass,   "md5"); 
7 } 

加密的方法很多,使用比较复杂的加密算法,安全性比较高些,但占用服务器资源比较大,会减慢整个网站的访问速度。
所以对Cookie加密在考虑三个方面:1:安全性,2:Cookie容量,3:整个网站的性能

 

 

来源:http://bbs.csdn.net/topics/30038595

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,将字符串作为以资料流为基础的模型,供加密转换之用。下面是一个简单的加密应用类的代码:

  1 Imports System.Diagnostics
  2  
  3 Imports System.Security.Cryptography
  4  
  5 Imports System.Text
  6  
  7 Imports System.IO
  8  
  9 
 10 Public Class CryptoUtil
 11  
 12 
 13 '随机选8个字节既为密钥也为初始向量
 14  
 15 Private Shared KEY_64() As Byte = {42, 16, 93, 156, 78, 4, 218, 32}
 16  
 17 Private Shared IV_64() As Byte = {55, 103, 246, 79, 36, 99, 167, 3}
 18  
 19 
 20 '对TripleDES,采取24字节或192位的密钥和初始向量
 21  
 22 Private Shared KEY_192() As Byte = {42, 16, 93, 156, 78, 4, 218, 32, _
 23  
 24 15, 167, 44, 80, 26, 250, 155, 112, _
 25  
 26 2, 94, 11, 204, 119, 35, 184, 197}
 27  
 28 Private Shared IV_192() As Byte = {55, 103, 246, 79, 36, 99, 167, 3, _
 29  
 30 42, 5, 62, 83, 184, 7, 209, 13, _
 31  
 32 145, 23, 200, 58, 173, 10, 121, 222}
 33  
 34 
 35 '标准的DES加密
 36  
 37 Public Shared Function Encrypt(ByVal value As String) As String
 38  
 39 If value <> "" Then
 40  
 41 Dim cryptoProvider As DESCryptoServiceProvider = _
 42  
 43 New DESCryptoServiceProvider()
 44  
 45 Dim ms As MemoryStream = New MemoryStream()
 46  
 47 Dim cs As CryptoStream = _
 48  
 49 New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), _
 50  
 51 CryptoStreamMode.Write)
 52  
 53 Dim sw As StreamWriter = New StreamWriter(cs)
 54  
 55 
 56 sw.Write(value)
 57  
 58 sw.Flush()
 59  
 60 cs.FlushFinalBlock()
 61  
 62 ms.Flush()
 63  
 64 
 65 '再转换为一个字符串
 66  
 67 Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
 68  
 69 End If
 70  
 71 End Function
 72  
 73 
 74 
 75 '标准的DES解密
 76  
 77 Public Shared Function Decrypt(ByVal value As String) As String
 78  
 79 If value <> "" Then
 80  
 81 Dim cryptoProvider As DESCryptoServiceProvider = _
 82  
 83 New DESCryptoServiceProvider()
 84  
 85 
 86 '从字符串转换为字节组
 87  
 88 Dim buffer As Byte() = Convert.FromBase64String(value)
 89  
 90 Dim ms As MemoryStream = New MemoryStream(buffer)
 91  
 92 Dim cs As CryptoStream = _
 93  
 94 New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_64, IV_64), _
 95  
 96 CryptoStreamMode.Read)
 97  
 98 Dim sr As StreamReader = New StreamReader(cs)
 99  
100 
101 Return sr.ReadToEnd()
102  
103 End If
104  
105 End Function
106  
107 
108 'TRIPLE DES加密
109  
110 Public Shared Function EncryptTripleDES(ByVal value As String) As String
111  
112 If value <> "" Then
113  
114 Dim cryptoProvider As TripleDESCryptoServiceProvider = _
115  
116 New TripleDESCryptoServiceProvider()
117  
118 Dim ms As MemoryStream = New MemoryStream()
119  
120 Dim cs As CryptoStream = _
121  
122 New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_192, IV_192), _
123  
124 CryptoStreamMode.Write)
125  
126 Dim sw As StreamWriter = New StreamWriter(cs)
127  
128 
129 sw.Write(value)
130  
131 sw.Flush()
132  
133 cs.FlushFinalBlock()
134  
135 ms.Flush()
136  
137 
138 '再转换为一个字符串
139  
140 Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
141  
142 End If
143  
144 End Function
145  
146 
147 
148 'TRIPLE DES解密
149  
150 Public Shared Function DecryptTripleDES(ByVal value As String) As String
151  
152 If value <> "" Then
153  
154 Dim cryptoProvider As TripleDESCryptoServiceProvider = _
155  
156 New TripleDESCryptoServiceProvider()
157  
158 
159 '从字符串转换为字节组
160  
161 Dim buffer As Byte() = Convert.FromBase64String(value)
162  
163 Dim ms As MemoryStream = New MemoryStream(buffer)
164  
165 Dim cs As CryptoStream = _
166  
167 New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_192, IV_192), _
168  
169 CryptoStreamMode.Read)
170  
171 Dim sr As StreamReader = New StreamReader(cs)
172  
173 
174 Return sr.ReadToEnd()
175  
176 End If
177  
178 End Function
179  
180 
181 End Class
182  

上面我们将一组字节初始化为密钥,并且使用的是数字常量,如果你在实际应用中也这样做,这些字节一定要在0和255之间,这是一个字节允许的范围值。

三、创建一个Cookie的应用类

下面我们就创建一个简单的类,来设置和获取Cookies。

  1 Public Class CookieUtil
  2  
  3 
  4 '设置COOKIE *****************************************************
  5  
  6 
  7 'SetTripleDESEncryptedCookie (只针对密钥和Cookie数据)
  8  
  9 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _
 10  
 11 ByVal value As String)
 12  
 13 key = CryptoUtil.EncryptTripleDES(key)
 14  
 15 value = CryptoUtil.EncryptTripleDES(value)
 16  
 17 
 18 SetCookie(key, value)
 19  
 20 End Sub
 21  
 22 
 23 'SetTripleDESEncryptedCookie (增加了Cookie数据的有效期参数)
 24  
 25 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _
 26  
 27 ByVal value As String, ByVal expires As Date)
 28  
 29 key = CryptoUtil.EncryptTripleDES(key)
 30  
 31 value = CryptoUtil.EncryptTripleDES(value)
 32  
 33 
 34 SetCookie(key, value, expires)
 35  
 36 End Sub
 37  
 38 
 39 
 40 'SetEncryptedCookie(只针对密钥和Cookie数据)
 41  
 42 Public Shared Sub SetEncryptedCookie(ByVal key As String, _
 43  
 44 ByVal value As String)
 45  
 46 key = CryptoUtil.Encrypt(key)
 47  
 48 value = CryptoUtil.Encrypt(value)
 49  
 50 
 51 SetCookie(key, value)
 52  
 53 End Sub
 54  
 55 
 56 'SetEncryptedCookie (增加了Cookie数据的有效期参数)
 57  
 58 Public Shared Sub SetEncryptedCookie(ByVal key As String, _
 59  
 60 ByVal value As String, ByVal expires As Date)
 61  
 62 key = CryptoUtil.Encrypt(key)
 63  
 64 value = CryptoUtil.Encrypt(value)
 65  
 66 
 67 SetCookie(key, value, expires)
 68  
 69 End Sub
 70  
 71 
 72 
 73 'SetCookie (只针对密钥和Cookie数据)
 74  
 75 Public Shared Sub SetCookie(ByVal key As String, ByVal value As String)
 76  
 77 '编码部分
 78  
 79 key = HttpContext.Current.Server.UrlEncode(key)
 80  
 81 value = HttpContext.Current.Server.UrlEncode(value)
 82  
 83 
 84 Dim cookie As HttpCookie
 85  
 86 cookie = New HttpCookie(key, value)
 87  
 88 SetCookie(cookie)
 89  
 90 End Sub
 91  
 92 
 93 'SetCookie(增加了Cookie数据的有效期参数)
 94  
 95 Public Shared Sub SetCookie(ByVal key As String, _
 96  
 97 ByVal value As String, ByVal expires As Date)
 98  
 99 '编码部分
100  
101 key = HttpContext.Current.Server.UrlEncode(key)
102  
103 value = HttpContext.Current.Server.UrlEncode(value)
104  
105 
106 Dim cookie As HttpCookie
107  
108 cookie = New HttpCookie(key, value)
109  
110 cookie.Expires = expires
111  
112 SetCookie(cookie)
113  
114 End Sub

 

 

相关文章
|
1月前
|
存储 SQL 安全
加密后的数据如何进行模糊查询?
在数据安全和隐私保护日益重要的今天,加密技术成为保护敏感数据的重要手段。然而,加密后的数据在存储和传输过程中虽然安全性得到了提升,但如何对这些数据进行高效查询,尤其是模糊查询,成为了一个挑战。本文将深入探讨如何在保证数据安全的前提下,实现加密数据的模糊查询功能。
212 0
|
3月前
|
存储 数据安全/隐私保护
.NET Core 究竟隐藏着怎样的神秘力量,能实现强身份验证与数据加密?
【8月更文挑战第28天】在数字化时代,数据安全与身份验证至关重要。.NET Core 提供了强大的工具,如 Identity 框架,帮助我们构建高效且可靠的身份验证系统,并支持高度定制化的用户模型和认证逻辑。此外,通过 `System.Security.Cryptography` 命名空间,.NET Core 还提供了丰富的加密算法和工具,确保数据传输和存储过程中的安全性。以下是一个简单的示例,展示如何使用 .NET Core 的 Identity 框架实现用户注册和登录功能。
39 3
|
15天前
|
数据库 数据安全/隐私保护 Windows
Windows远程桌面出现CredSSP加密数据修正问题解决方案
【10月更文挑战第30天】本文介绍了两种解决Windows系统凭据分配问题的方法。方案一是通过组策略编辑器(gpedit.msc)启用“加密数据库修正”并将其保护级别设为“易受攻击”。方案二是通过注册表编辑器(regedit)在指定路径下创建或修改名为“AllowEncryptionOracle”的DWORD值,并将其数值设为2。
43 3
|
21天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
1月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
40 2
|
1月前
|
算法 安全 数据安全/隐私保护
加密和解密数据
【10月更文挑战第6天】加密和解密数据
48 2
|
2月前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
89 11
|
2月前
|
数据安全/隐私保护
vuex数据持久化、加密(vuex-persistedstate、secure-ls)
本文介绍了如何在Vuex中使用`vuex-persistedstate`和`secure-ls`库进行数据的持久化和加密,确保在Vite打包上线后,Vuex中的数据安全。
79 1
|
2月前
|
存储 安全 数据库
Uno Platform 安全数据存储秘籍大公开!加密、存储、读取全攻略,让你的数据固若金汤!
在软件开发中,安全的数据存储至关重要。本文介绍如何在跨平台开发框架 Uno Platform 中实现安全数据存储,包括选择合适的数据存储方式(如本地文件或 SQLite 数据库)和使用 Bouncy Castle 加密库对数据进行 AES 加密。通过示例代码展示了数据的加密、存储及解密过程,帮助开发者保护用户敏感信息,防止数据泄露。
45 3
|
1月前
|
JavaScript 数据安全/隐私保护
马蜂窝 cookie 加密(加速乐)
本文介绍了一次针对马蜂窝网站的逆向工程过程,旨在学习交流,不提供完整代码及敏感信息。文中详细描述了三次GET请求的过程,通过抓包工具分析了请求头和响应内容,并逐步解析了`cookie`参数的生成方法。最终通过携带特定`cookie`成功获取页面内容。严禁将本文内容用于非法或商业用途,违者自行承担一切后果。未经许可不得转载或修改后传播。
83 0