我们知道
![](/icons/206dou.gif)
现在网络上
![](/icons/206yi.gif)
般
![](/icons/206de.gif)
网站WebSite
![](/icons/206dou.gif)
稍微完善
![](/icons/206yi.gif)
点
![](/icons/206de.gif)
![](/icons/206dou.gif)
往往都需要用户先注册
![](/icons/206dou.gif)
提供诸如电子邮件、账号、密码等信息以后
![](/icons/206dou.gif)
成为网站WebSite栏目
![](/icons/206de.gif)
注册用户
![](/icons/206dou.gif)
才可以享受网站WebSite
![](/icons/206yi.gif)
些特殊栏目提供
![](/icons/206de.gif)
信息或者服务
![](/icons/206dou.gif)
比如免费电子邮件、论坛、聊天等
![](/icons/206dou.gif)
都需要用户注册
![](/icons/206dou2.gif)
而对于电子商务网站WebSite
![](/icons/206dou.gif)
比如igo5等大型电子商务网站WebSite
![](/icons/206dou.gif)
用户需要购买商品
![](/icons/206dou.gif)
就
![](/icons/206yi.gif)
定需要详细而准确
![](/icons/206de.gif)
注册
![](/icons/206dou.gif)
而这些信息
![](/icons/206dou.gif)
往往是用户很隐秘
![](/icons/206de.gif)
信息
![](/icons/206dou.gif)
比如电话、电子邮件、地址等
![](/icons/206dou.gif)
所以
![](/icons/206dou.gif)
注册信息对于用户和网站WebSite都是很重要
![](/icons/206de.gif)
资源
![](/icons/206dou.gif)
不能随意透露
![](/icons/206dou.gif)
更加不能存在安全上
![](/icons/206de.gif)
隐患
如果我们也设计
![](/icons/206yi.gif)
个需要用户注册
![](/icons/206de.gif)
网站WebSite
![](/icons/206dou.gif)
根据现在
![](/icons/206de.gif)
常用技术实现思路方法
![](/icons/206dou.gif)
可以在数据库中建立
![](/icons/206yi.gif)
个用于存放用户信息
![](/icons/206de.gif)
表
![](/icons/206dou.gif)
这个表中至少包括用户账号字段:UserAccount和用户密码字段:Password
![](/icons/206dou.gif)
当然
![](/icons/206dou.gif)
实际应用中
![](/icons/206yi.gif)
个用户信息表不可能就只有这些信息
![](/icons/206dou.gif)
往往根据网站WebSite服务要求
![](/icons/206dou.gif)
会适当增加
![](/icons/206yi.gif)
些其他
![](/icons/206de.gif)
信息
![](/icons/206dou.gif)
以方便网站WebSite提供更加完善
![](/icons/206de.gif)
服务
![](/icons/206dou2.gif)
![](/icons/206yi.gif)
般
![](/icons/206de.gif)
![](/icons/206dou.gif)
![](/icons/206yi.gif)
个用户信息占用这个用户信息表
![](/icons/206de.gif)
![](/icons/206yi.gif)
行也就是
![](/icons/206yi.gif)
个数据记录
![](/icons/206dou.gif)
当用户登录或者提交资料
![](/icons/206de.gif)
时候
![](/icons/206dou.gif)
![](/icons/206chengxu.gif)
将用户填写
![](/icons/206de.gif)
信息和表中
![](/icons/206de.gif)
信息对照
![](/icons/206dou.gif)
如果用户账号和密码都准确无误
![](/icons/206dou.gif)
那么介绍说明这个用户是合法用户
![](/icons/206dou.gif)
通过注册;反的
![](/icons/206dou.gif)
则是非法用户
![](/icons/206dou.gif)
不许通过
然而
![](/icons/206dou.gif)
是不是这样就安全了了?是不是这样就能满足网站WebSite
![](/icons/206de.gif)
注册要求了呢?仔细想想
![](/icons/206dou.gif)
我们
![](/icons/206yi.gif)
般将用户资料直接保存在数据库中
![](/icons/206dou.gif)
并没有进行任何
![](/icons/206de.gif)
保密措施
![](/icons/206dou.gif)
对于
![](/icons/206yi.gif)
些文件型数据库比如Access等
![](/icons/206dou.gif)
如果有人得到这个文件
![](/icons/206dou.gif)
岂不是所有
![](/icons/206de.gif)
资料都泄露无疑?更加重要
![](/icons/206de.gif)
是
![](/icons/206dou.gif)
如果
![](/icons/206yi.gif)
个不负责任
![](/icons/206de.gif)
网管
![](/icons/206dou.gif)
不需要任何技术手段
![](/icons/206dou.gif)
就可以查看网站WebSite中
![](/icons/206de.gif)
任何资料
![](/icons/206dou.gif)
如果我们
![](/icons/206de.gif)
用户信息在数据库中没有加密
![](/icons/206dou.gif)
对于网管而言
![](/icons/206dou.gif)
查看这些信息是太简单了
![](/icons/206dou2.gif)
所以
![](/icons/206dou.gif)
为了增加安全性
![](/icons/206dou.gif)
我们有必要对数据库中
![](/icons/206de.gif)
资料进行加密
![](/icons/206dou.gif)
这样
![](/icons/206dou.gif)
即使有人得到了整个数据库
![](/icons/206dou.gif)
如果没有解密算法
![](/icons/206dou.gif)
也
![](/icons/206yi.gif)
样不能查看到数据库中
![](/icons/206de.gif)
用户信息
![](/icons/206dou2.gif)
但是
![](/icons/206dou.gif)
在考虑数据库是否安全的前
![](/icons/206dou.gif)
我们有必要对我们
![](/icons/206de.gif)
数据是否真
![](/icons/206de.gif)
那么重要进行考虑
![](/icons/206dou.gif)
如果数据只是简单
![](/icons/206de.gif)
![](/icons/206yi.gif)
些文件资料
![](/icons/206dou.gif)
没有保密
![](/icons/206de.gif)
必要
![](/icons/206dou.gif)
显然
![](/icons/206dou.gif)
没有必要对这些数据进行加密而浪费系统资源、加重
![](/icons/206chengxu.gif)
负担
![](/icons/206dou.gif)
如果这些数据具有
![](/icons/206yi.gif)
定
![](/icons/206de.gif)
隐私性
![](/icons/206dou.gif)
当然就有必要进行加密
![](/icons/206dou2.gif)
所以
![](/icons/206dou.gif)
在考虑加密以前
![](/icons/206dou.gif)
我们可以对需要加密
![](/icons/206de.gif)
数据做适当
![](/icons/206de.gif)
选择
![](/icons/206dou.gif)
以免浪费系统资源
MD5加密算法简单介绍
在现阶段
![](/icons/206dou.gif)
我们
![](/icons/206yi.gif)
般认为存在两种加密方式
![](/icons/206dou.gif)
单向加密和双向加密
![](/icons/206dou2.gif)
双向加密是加密算法中最常用
![](/icons/206de.gif)
![](/icons/206dou.gif)
它将我们可以直接理解
![](/icons/206de.gif)
明文数据加密为我们不可直接理解
![](/icons/206de.gif)
密文数据
![](/icons/206dou.gif)
然后
![](/icons/206dou.gif)
在需要
![](/icons/206de.gif)
时候
![](/icons/206dou.gif)
可以使用
![](/icons/206yi.gif)
定
![](/icons/206de.gif)
算法将这些加密以后
![](/icons/206de.gif)
密文解密为原来可以理解
![](/icons/206de.gif)
明文
![](/icons/206dou2.gif)
双向加密适合于隐秘通讯
![](/icons/206dou.gif)
比如
![](/icons/206dou.gif)
我们在网上购物
![](/icons/206de.gif)
时候
![](/icons/206dou.gif)
需要向网站WebSite提交信用卡密码
![](/icons/206dou.gif)
我们当然不希望我们
![](/icons/206de.gif)
数据直接在网上明文传送
![](/icons/206dou.gif)
![](/icons/206yinwei.gif)
这样很可能被别
![](/icons/206de.gif)
用户“偷听”
![](/icons/206dou.gif)
我们希望我们
![](/icons/206de.gif)
信用卡密码是通过加密以后
![](/icons/206dou.gif)
再在网络传送
![](/icons/206dou.gif)
这样
![](/icons/206dou.gif)
网站WebSite接受到我们
![](/icons/206de.gif)
数据以后
![](/icons/206dou.gif)
通过解密算法就可以得到准确
![](/icons/206de.gif)
信用卡账号
单向加密刚好相反
![](/icons/206dou.gif)
只能对数据进行加密
![](/icons/206dou.gif)
也就是说
![](/icons/206dou.gif)
没有办法对加密以后
![](/icons/206de.gif)
数据进行解密
![](/icons/206dou2.gif)
可能我们立即就会想
![](/icons/206dou.gif)
这样
![](/icons/206de.gif)
加密有什么用处?不能解密
![](/icons/206de.gif)
加密算法有什么作用呢?在实际中
![](/icons/206de.gif)
![](/icons/206yi.gif)
个应用就是数据库中
![](/icons/206de.gif)
用户信息加密
![](/icons/206dou.gif)
当用户创建
![](/icons/206yi.gif)
个新
![](/icons/206de.gif)
账号或者密码
![](/icons/206dou.gif)
他
![](/icons/206de.gif)
信息不是直接保存到数据库
![](/icons/206dou.gif)
而是经过
![](/icons/206yi.gif)
次加密以后再保存
![](/icons/206dou.gif)
这样
![](/icons/206dou.gif)
即使这些信息被泄露
![](/icons/206dou.gif)
也不能立即理解这些信息
![](/icons/206de.gif)
真正含义
MD5就是采用单向加密
![](/icons/206de.gif)
加密算法
![](/icons/206dou.gif)
对于MD5而言
![](/icons/206dou.gif)
有两个特性是很重要
![](/icons/206de.gif)
![](/icons/206dou.gif)
第
![](/icons/206yi.gif)
是任意两段明文数据
![](/icons/206dou.gif)
加密以后
![](/icons/206de.gif)
密文不能是相同
![](/icons/206de.gif)
;第 2是任意
![](/icons/206yi.gif)
段明文数据
![](/icons/206dou.gif)
经过加密以后
![](/icons/206dou.gif)
其结果必须永远是不变
![](/icons/206de.gif)
![](/icons/206dou2.gif)
前者
![](/icons/206de.gif)
意思是不可能有任意两段明文加密以后得到相同
![](/icons/206de.gif)
密文
![](/icons/206dou.gif)
后者
![](/icons/206de.gif)
意思是如果我们加密特定
![](/icons/206de.gif)
数据
![](/icons/206dou.gif)
得到
![](/icons/206de.gif)
密文
![](/icons/206yi.gif)
定是相同
![](/icons/206de.gif)
MD5CyptoServiceProvider类是.NET中
![](/icons/206System.gif)
.Security.Cryptography名字空间
![](/icons/206de.gif)
![](/icons/206yi.gif)
个类
![](/icons/206dou.gif)
提供专门用于MD5单向数据加密
![](/icons/206de.gif)
解决思路方法
![](/icons/206dou.gif)
也是本文中我们用来加密数据库中密码
![](/icons/206de.gif)
类
![](/icons/206dou2.gif)
在真正进行数据加密的前
![](/icons/206dou.gif)
我们首先来了解MD5CyptoServiceProvider类中
![](/icons/206de.gif)
主要思路方法:ComputeHash
![](/icons/206dou.gif)
它将输入
![](/icons/206de.gif)
明文数据
![](/icons/206shuzu.gif)
使用MD5加密以后输出加密后
![](/icons/206de.gif)
密文数据
![](/icons/206shuzu.gif)
![](/icons/206dou2.gif)
现在
![](/icons/206dou.gif)
我们就来看
![](/icons/206yi.gif)
个具体
![](/icons/206de.gif)
例子:
'要加密
![](/icons/206de.gif)
明文
![](/icons/206zifu.gif)
串
Dim strPlainText as String = "Encrypt me!"
'用于存放明文
![](/icons/206zifu.gif)
串
![](/icons/206de.gif)
Dim hashedDataBytes as Byte
Dim encoder as New UTF8Encoding
'建立MD5CryptoService例子
Dim md5Hasher as New MD5CryptoServiceProvider
'加密运算
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))
看完以上
![](/icons/206de.gif)
具体例子以后
![](/icons/206dou.gif)
我们知道
![](/icons/206dou.gif)
ComputeHash思路方法只能接受
![](/icons/206shuzu.gif)
作为加密对象
![](/icons/206dou.gif)
输出
![](/icons/206de.gif)
密文也是
![](/icons/206shuzu.gif)
![](/icons/206dou.gif)
因此
![](/icons/206dou.gif)
在对
![](/icons/206zifu.gif)
串加密的前
![](/icons/206dou.gif)
我们必须首先将这些
![](/icons/206zifu.gif)
串转化为
![](/icons/206shuzu.gif)
![](/icons/206dou.gif)
这就要用到UTF8Encoding类
![](/icons/206de.gif)
GetBytes思路方法
![](/icons/206dou.gif)
将
![](/icons/206zifu.gif)
串转化为
![](/icons/206shuzu.gif)
![](/icons/206dou.gif)
而加密以后
![](/icons/206de.gif)
结果也是使用
![](/icons/206shuzu.gif)
输出
以上我们大致了解了MD5
![](/icons/206de.gif)
具体加密实现思路方法
![](/icons/206dou.gif)
下面
![](/icons/206dou.gif)
我们结合数据库来看看MD5
![](/icons/206de.gif)
实际使用
使用MD5存储密码
在前面
![](/icons/206de.gif)
介绍中
![](/icons/206dou.gif)
我们提到网站WebSite往往将用户
![](/icons/206de.gif)
账号、密码等信息使用非加密
![](/icons/206de.gif)
方式保存到数据库
![](/icons/206dou.gif)
比如账号使用类型为VarChar
![](/icons/206de.gif)
UserCount字段
![](/icons/206dou.gif)
同样
![](/icons/206dou.gif)
密码也是采用类型为VarChar
![](/icons/206de.gif)
Password字段
![](/icons/206dou2.gif)
但是
![](/icons/206dou.gif)
如果我们打算采用MD5加密方式存储密码信息
![](/icons/206dou.gif)
就必须改变密码字段PassWord
![](/icons/206de.gif)
类型为16为 2进制方式
![](/icons/206dou.gif)
这个其实我们也不难理解
![](/icons/206dou.gif)
![](/icons/206yinwei.gif)
在前面
![](/icons/206de.gif)
介绍中
![](/icons/206dou.gif)
我们知道加密以后
![](/icons/206de.gif)
输出
![](/icons/206dou.gif)
是使用 2进制
![](/icons/206shuzu.gif)
![](/icons/206de.gif)
![](/icons/206dou.gif)
所以
![](/icons/206dou.gif)
这里必须做相应
![](/icons/206de.gif)
改变
当用户注册成功
![](/icons/206dou.gif)
正式建立
![](/icons/206yi.gif)
个账号
![](/icons/206de.gif)
时候
![](/icons/206dou.gif)
数据库中就必须为这个用户增加
![](/icons/206yi.gif)
条记录
![](/icons/206dou2.gif)
以下
![](/icons/206de.gif)
![](/icons/206chengxu.gif)
代码实现了建立
![](/icons/206yi.gif)
个账号
![](/icons/206de.gif)
功能
![](/icons/206dou.gif)
在页面中
![](/icons/206dou.gif)
![](/icons/206chengxu.gif)
要求用户输入账号、密码等信息
![](/icons/206dou.gif)
然后
![](/icons/206dou.gif)
将这些信息作为账号信息存入名为UserCount
![](/icons/206de.gif)
数据表
![](/icons/206dou.gif)
在这个表中
![](/icons/206dou.gif)
用户密码是使用MD5加密保存
![](/icons/206de.gif)
![](/icons/206dou2.gif)
下面就是实现以上页面
![](/icons/206de.gif)
具体代码:
建立
![](/icons/206yi.gif)
个账号
用户名:
密码:
OnClick="CreateAccount" />
在以上
![](/icons/206chengxu.gif)
实现
![](/icons/206de.gif)
页面中
![](/icons/206dou.gif)
“用户名”和“密码”输入框要求用户输入自己
![](/icons/206de.gif)
账号和密码
![](/icons/206dou.gif)
用户输入自己
![](/icons/206de.gif)
信息以后
![](/icons/206dou.gif)
按“建立用户账号”按钮
![](/icons/206dou.gif)
就可以建立
![](/icons/206yi.gif)
个账号并且存入数据库
![](/icons/206dou2.gif)
我们同时需要特别注意
![](/icons/206dou.gif)
![](/icons/206yinwei.gif)
以上
![](/icons/206de.gif)
![](/icons/206chengxu.gif)
使用到了MD5加密和数据库等功能
![](/icons/206dou.gif)
所以
![](/icons/206dou.gif)
在代码最开头
![](/icons/206dou.gif)
我们引入了几个稍微特别
![](/icons/206yi.gif)
点
![](/icons/206de.gif)
名字空间
![](/icons/206dou.gif)
这是不可缺少
![](/icons/206de.gif)
我们可以看到
![](/icons/206dou.gif)
PassWord字段
![](/icons/206de.gif)
信息是 2进制方式保存
![](/icons/206de.gif)
![](/icons/206dou.gif)
即使数据库被人取得
![](/icons/206dou.gif)
也不可能知道密码具体是什么意思
![](/icons/206dou2.gif)
当然
![](/icons/206dou.gif)
密码也就不会泄露
使用MD5鉴别是否合法用户
既然用户密码是按照MD5加密以后保存在数据库中
![](/icons/206de.gif)
![](/icons/206dou.gif)
我们知道
![](/icons/206dou.gif)
MD5是单次加密算法
![](/icons/206dou.gif)
所以
![](/icons/206dou.gif)
不可能将加密以后
![](/icons/206de.gif)
信息转为明文
![](/icons/206dou.gif)
也就是说
![](/icons/206dou.gif)
已经没有办法知道
![](/icons/206dou2.gif)
这就出现
![](/icons/206yi.gif)
个问题
![](/icons/206dou.gif)
如果用户使用账号、密码登录
![](/icons/206dou.gif)
如何知道用户提供
![](/icons/206de.gif)
密码是否准确呢?
这就不得不提到我们前文说到
![](/icons/206de.gif)
MD5
![](/icons/206de.gif)
特征
![](/icons/206dou.gif)
我们知道
![](/icons/206dou.gif)
任意
![](/icons/206yi.gif)
段明文数据
![](/icons/206dou.gif)
经过加密以后
![](/icons/206dou.gif)
其结果必须永远是不变
![](/icons/206de.gif)
![](/icons/206dou.gif)
也就是说
![](/icons/206dou.gif)
如果需要验证用户密码是否正确
![](/icons/206dou.gif)
只需要将用户当前提供
![](/icons/206de.gif)
密码使用MD5加密
![](/icons/206dou.gif)
然后和数据库中保存
![](/icons/206de.gif)
密码字段比较就可以了
![](/icons/206dou2.gif)
以下代码就可以实现这个功能:
Login
用户账号:
密码:
使用加密方式保存密码到数据库
![](/icons/206de.gif)
限制
在决定是否使用加密方式保存密码以前
![](/icons/206dou.gif)
我们还需要考虑
![](/icons/206yi.gif)
些问题
![](/icons/206dou2.gif)
![](/icons/206yinwei.gif)
MD5是单次加密算法
![](/icons/206dou.gif)
加密以后
![](/icons/206de.gif)
信息不可以解密
![](/icons/206dou.gif)
所以
![](/icons/206dou.gif)
如果用户丢失密码
![](/icons/206dou.gif)
任何人都很难找到用户原来
![](/icons/206de.gif)
密码
![](/icons/206dou.gif)
这时候
![](/icons/206dou.gif)
网站WebSite也就相应
![](/icons/206de.gif)
失去
![](/icons/206yi.gif)
个很重要
![](/icons/206de.gif)
功能
![](/icons/206dou.gif)
那就是用户提供其他信息来取得忘记
![](/icons/206de.gif)
密码
![](/icons/206de.gif)
功能
![](/icons/206dou.gif)
这不能不说是网站WebSite
![](/icons/206de.gif)
![](/icons/206yi.gif)
个大缺陷
![](/icons/206dou2.gif)
另外
![](/icons/206dou.gif)
采用这样
![](/icons/206de.gif)
加密方式
![](/icons/206dou.gif)
必须完全修改以前
![](/icons/206de.gif)
用户资料
![](/icons/206dou.gif)
要求用户完全重新注册
![](/icons/206dou.gif)
这也是这种思路方法比较困难
![](/icons/206de.gif)
![](/icons/206yi.gif)
个地方
整理总结
以上我们详细介绍了MD5加密用户密码
![](/icons/206de.gif)
实现思路方法
![](/icons/206dou.gif)
同时
![](/icons/206dou.gif)
也介绍了采用加密密码方式以后
![](/icons/206dou.gif)
用户鉴别
![](/icons/206de.gif)
实现
![](/icons/206dou2.gif)
并讨论了使用这种加密方式
![](/icons/206de.gif)
应用限制
![](/icons/206dou2.gif)
在实际应用中
![](/icons/206dou.gif)
我们可以将次思路方法做适当
![](/icons/206de.gif)
修改和补充
![](/icons/206dou.gif)
以更加适合我们
![](/icons/206de.gif)
应用需要
上
篇文章: 看着你
秘密
我
眼----网络嗅探技术介绍
下
篇文章: 特洛伊木马大揭密
延伸阅读
最新评论