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

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

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

加密的方法很多,使用比较复杂的加密算法,安全性比较高些,但占用服务器资源比较大,会减慢整个网站的访问速度。
所以对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,将字符串作为以资料流为基础的模型,供加密转换之用。下面是一个简单的加密应用类的代码:

 Imports System.Diagnostics

 Imports System.Security.Cryptography

 Imports System.Text

 Imports System.IO

 Public Class CryptoUtil

 '随机选8个字节既为密钥也为初始向量

 Private Shared KEY_64() As Byte = {, , , , , , , }

 Private Shared IV_64() As Byte = {, , , , , , , }

 '对TripleDES,采取24字节或192位的密钥和初始向量

 Private Shared KEY_192() As Byte = {, , , , , , , , _

 , , , , , , , , _

 , , , , , , , }

 Private Shared IV_192() 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, 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(), , 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

 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, cryptoProvider.CreateEncryptor(KEY_192, IV_192), _

 CryptoStreamMode.Write)

 Dim sw As StreamWriter = New StreamWriter(cs)

 sw.Write(value)

 sw.Flush()

 cs.FlushFinalBlock()

 ms.Flush()

 '再转换为一个字符串

 Return Convert.ToBase64String(ms.GetBuffer(), , ms.Length)

 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() = Convert.FromBase64String(value)

 Dim ms As MemoryStream = New MemoryStream(buffer)

 Dim cs As CryptoStream = _

 New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_192, IV_192), _

 CryptoStreamMode.Read)

 Dim sr As StreamReader = New StreamReader(cs)

 Return sr.ReadToEnd()

 End If

 End Function

 End Class
  

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

三、创建一个Cookie的应用类

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

 Public Class CookieUtil

 '设置COOKIE *****************************************************

 'SetTripleDESEncryptedCookie (只针对密钥和Cookie数据)

 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _

 ByVal value As String)

 key = CryptoUtil.EncryptTripleDES(key)

 value = CryptoUtil.EncryptTripleDES(value)

 SetCookie(key, value)

 End Sub

 'SetTripleDESEncryptedCookie (增加了Cookie数据的有效期参数)

 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _

 ByVal value As String, ByVal expires As Date)

 key = CryptoUtil.EncryptTripleDES(key)

 value = CryptoUtil.EncryptTripleDES(value)

 SetCookie(key, value, expires)

 End Sub

 'SetEncryptedCookie(只针对密钥和Cookie数据)

 Public Shared Sub SetEncryptedCookie(ByVal key As String, _

 ByVal value As String)

 key = CryptoUtil.Encrypt(key)

 value = CryptoUtil.Encrypt(value)

 SetCookie(key, value)

 End Sub

 'SetEncryptedCookie (增加了Cookie数据的有效期参数)

 Public Shared Sub SetEncryptedCookie(ByVal key As String, _

 ByVal value As String, ByVal expires As Date)

 key = CryptoUtil.Encrypt(key)

 value = CryptoUtil.Encrypt(value)

 SetCookie(key, value, expires)

 End Sub

 'SetCookie (只针对密钥和Cookie数据)

 Public Shared Sub SetCookie(ByVal key As String, ByVal value As String)

 '编码部分

 key = HttpContext.Current.Server.UrlEncode(key)

 value = HttpContext.Current.Server.UrlEncode(value)

 Dim cookie As HttpCookie

 cookie = New HttpCookie(key, value)

 SetCookie(cookie)

 End Sub

 'SetCookie(增加了Cookie数据的有效期参数)

 Public Shared Sub SetCookie(ByVal key As String, _

 ByVal value As String, ByVal expires As Date)

 '编码部分

 key = HttpContext.Current.Server.UrlEncode(key)

 value = HttpContext.Current.Server.UrlEncode(value)

 Dim cookie As HttpCookie

 cookie = New HttpCookie(key, value)

 cookie.Expires = expires

 SetCookie(cookie)

 End Sub

【转】用ASP.NET加密Cookie数据的更多相关文章

  1. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

  2. Asp.net操作cookie大全

    实例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...

  3. ASP.NET 操作Cookie详解 增加,修改,删除

    ASP.NET 操作Cookie详解 增加,修改,删除 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它 ...

  4. 详细介绍ASP.NET页面间数据传递的使用方法

    源码:http://www.jinhusns.com/Products/Download/?type=xcj 在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. ...

  5. ASP.NET页面间数据传递的方法<转>

    ASP.NET页面间数据传递的方法 作者: 灰色的天空2  来源: 博客园  发布时间: 2010-10-28 11:06  阅读: 822 次  推荐: 0   原文链接   [收藏]   摘要:本 ...

  6. ASP.NET 页面间数据传递的方法

    在做WEB开发时,很多地方会涉及到页面间的数据传递.这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下: 说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是 ...

  7. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  8. asp.net各种cookie代码和解析

    Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...

  9. ASP与ASP.NET转换Session数据桥的应用

    背景: 现有公司的产品OA是采用ASP早先的技术开发,需要与目前最新的ASP.NET产品进行数据交互的应用.现有的ASP应用程序往往采用“ASP Sessions”,这是一种经典的ASP内置模式,即允 ...

随机推荐

  1. Makefile学习笔记

    ls -l 查看文件详细信息 1.gcc -E test.c -o test.i//预编译gedit test.i //查看:高级C 2.gcc -Wall -S test.i -o test.s// ...

  2. zf2-tutorial调通,坑爹的init_autoloader.php

    zf2-tutorial的作者把init_autoloader.php内容写错了,新建个工程,把其中的这个文件的内容替一下,然后建库/建表,把local.ini打开(不是必须的),用户名/口令等配好, ...

  3. linux命令:ls

    1.介绍: ls是linux日常操作中用的最多命令,是list的缩写,默认按名称排序列出当前目录和文件,ls --help可以查看帮助. 2.命令格式: ls [OPTION] [FILE] 3.命令 ...

  4. PHP_Const

    PHP_Const 常量 规则: 1 总是大写 2 A-Z 及 从127-255的ASCII字符 3 全局范围 4 用define函数定义 5 只能包含标量数据 如Boolean integer fl ...

  5. 如何避免后台IO高负载造成的长时间JVM GC停顿(转)

    译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ...

  6. 1分钟学会Markdown语法

    markdown 简明语法 基本符号 *,-,+ 3个符号效果都一样,这3个符号被称为 Markdown符号 空白行表示另起一个段落 `是表示inline代码,tab是用来标记 代码段,分别对应htm ...

  7. C++ Primer : 第十一章 : 关联容器之关联容器的迭代器和操作

    关联容器的操作 除了和顺序容器定义的类型之外,关联容器还定义了一下几种类型: 关联容器额外的类型别名  key_type    此容器类型的关键字类型 mapped_type  每个关键字关联的类型, ...

  8. centos6.3 + db2v9.7的数据库移行

    工作内容如题,我要做的事情大体如下: 1,正确备份可用数据库: 2,安装64位的cent os 6.3: 3,将1备份的数据恢复到新的cent os 6.3系统上. 第一件事情,就是备份一个可用的数据 ...

  9. 关于JSP的C标签之forEach循环分隔符

    页面中可能说出现在forEach循环中间需要出力分隔符的问题, 比如: 小明 1年级,小王 2年级, 小张 3年级(循环单位是 ${bean.name} ${bean.class}) 此时的逗号出力, ...

  10. SQLServer如何用T—SQL命令查询一个数据库中有哪些表

    1.查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执 ...