使用MD5加密数据库中的用户密码(一)

我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件、账号、密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特殊栏目提供的信息或者服务,比如免费电子邮件、论坛、聊天等,都需要用户注册。而对于电子商务网站,比如igo5等大型电子商务网站,用户需要购买商品,就一定需要详细而准确的注册,而这些信息,往往是用户很隐秘的信息,比如电话、电子邮件、地址等,所以,注册信息对于用户和网站都是很重要的资源,不能随意透露,更加不能存在安全上的隐患。

如果我们也设计一个需要用户注册的网站,根据现在的常用技术实现方法,可以在数据库中建立一个用于存放用户信息的表,这个表中至少包括用户账号字段:UserAccount和用户密码字段:Password,当然,实际应用中一个用户信息表不可能就只有这些信息,往往根据网站服务要求,会适当增加一些其他的信息,以方便网站提供更加完善的服务。一般的,一个用户信息占用这个用户信息表的一行也就是一个数据记录,当用户登录或者提交资料的时候,程序将用户填写的信息与表中的信息对照,如果用户账号和密码都准确无误,那么说明这个用户是合法用户,通过注册;反之,则是非法用户,不许通过。

然而,是不是这样就安全了了?是不是这样就能满足网站的注册要求了呢?仔细想想,我们一般将用户资料直接保存在数据库中,并没有进行任何的保密措施,对于一些文件型数据库比如Access等,如果有人得到这个文件,岂不是所有的资料都泄露无疑?更加重要的是,如果一个不负责任的网管,不需要任何技术手段,就可以查看网站中的任何资料,如果我们的用户信息在数据库中没有加密,对于网管而言,查看这些信息是太简单了。所以,为了增加安全性,我们有必要对数据库中的资料进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也一样不能查看到数据库中的用户信息。但是,在考虑数据库是否安全之前,我们有必要对我们的数据是否真的那么重要进行考虑,如果数据只是简单的一些文件资料,没有保密的必要,显然,没有必要对这些数据进行加密而浪费系统资源、加重程序负担,如果这些数据具有一定的隐私性,当然就有必要进行加密。所以,在考虑加密以前,我们可以对需要加密的数据做适当的选择,以免浪费系统资源。

MD5加密算法简单介绍

在现阶段,我们一般认为存在两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。

单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。可能我们立即就会想,这样的加密有什么用处?不能解密的加密算法有什么作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

MD5CyptoServiceProvider类是.NET中System.Security.Cryptography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中我们用来加密数据库中密码的类。在真正进行数据加密之前,我们首先来了解MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。现在,我们就来看一个具体的实例:

'要加密的明文字符串

Dim strPlainText as String = "Encrypt me!"

'用于存放明文字符串的数组

Dim hashedDataBytes as Byte()

Dim encoder as New UTF8Encoding()

'建立MD5CryptoService实例

Dim md5Hasher as New MD5CryptoServiceProvider()

'加密运算

hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))

看完以上的具体实例以后,我们知道,ComputeHash方法只能接受数组作为加密对象,输出的密文也是数组,因此,在对字符串加密之前,我们必须首先将这些字符串转化为数组,这就要用到UTF8Encoding类的GetBytes方法,将字符串转化为数组,而加密以后的结果也是使用数组输出。

以上我们大致了解了MD5的具体加密实现方法,下面,我们结合数据库来看看MD5的实际使用。

使用MD5存储密码

在前面的介绍中,我们提到网站往往将用户的账号、密码等信息使用非加密的方式保存到数据库,比如账号使用类型为VarChar的UserCount字段,同样,密码也是采用类型为VarChar的Password字段。但是,如果我们打算采用MD5加密方式存储密码信息,就必须改变密码字段Password的类型为16为二进制方式,这个其实我们也不难理解,因为在前面的介绍中,我们知道加密以后的输出,是使用二进制数组的,所以,这里必须做相应的改变。

当用户注册成功,正式建立一个账号的时候,数据库中就必须为这个用户增加一条记录。以下的程序代码实现了建立一个账号的功能,在页面中,程序要求用户输入账号、密码等信息,然后,将这些信息作为账号信息存入名为UserCount的数据表,在这个表中,用户密码是使用MD5加密保存的。下面就是实现以上页面的具体代码:

Sub CreateAccount(sender as Object, e as EventArgs)

'1. 建立数据库连接

Const strConnString as String = "connection string"

Dim objConn as New SqlConnection(strConnString)

'2. 建立Command对象

Dim strSQL as String = _

"INSERT INTO UserAccount(Username,Password) " & _

"VALUES(@Username, @Password)"

Dim objCmd as New SqlCommand(strSQL, objConn)

'3. SQL参数

Dim paramUsername as SqlParameter

paramUsername= New SqlParameter("@Username", SqlDbType.VarChar, 25)

paramUsername.Value = txtUsername.Text

objCmd.Parameters.Add(paramUsername)

'加密用户密码

Dim md5Hasher as New MD5CryptoServiceProvider()

Dim hashedBytes as Byte()

Dim encoder as New UTF8Encoding()

hashedBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))

Dim paramPwd as SqlParameter

paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)

paramPwd.Value = hashedBytes

objCmd.Parameters.Add(paramPwd)

'加入数据库

objConn.Open()

objCmd.ExecuteNonQuery()

objConn.Close()

End Sub

建立一个账号

用户名:

密码:

在以上程序实现的页面中,“用户名”和“密码”输入框要求用户输入自己的账号和密码,用户输入自己的信息以后,按“建立用户账号”按钮,就可以建立一个账号并且存入数据库。我们同时需要特别注意,因为以上的程序使用到了MD5加密和数据库等功能,所以,在代码最开头,我们引入了几个稍微特别一点的名字空间,这是不可缺少的。

我们可以看到,Password字段的信息是二进制方式保存的,即使数据库被人取得,也不可能知道密码具体是什么意思。当然,密码也就不会泄露

本文作者:相关阅读:

基于jquery的拖动布局插件

jQuery的写法不同导致的兼容性问题的解决方法

sqlserver另类非递归的无限级分类(存储过程版)

完全卸载苹果工具条的4个方法

CSS网页布局教程:绝对定位和相对定位

js创建对象的几种常用方式小结(推荐)

js正则实现的密码框简单制作,还可以替换成自己想用得符号

Vista下安装SQL Sever 2005报错的解决办法

用!important解决IE和Mozilla的布局差别

原创]仿google adsense颜色选择器代码,从中易广告联盟程序提取" target="_blank">[原创]仿google adsense颜色选择器代码,从中易广告联盟程序提取

Ajax,用该所用

Windows7上帝模式类似的隐藏的快捷方式

DIV+CSS布局体验总结 脚本之家推荐

模拟jQuery ajax服务器端与客户端通信的代码

md5加密数据表中的密码php,JSP_使用MD5加密数据库中的用户密码(一),我们知道,现在网络上一般的 - phpStudy...相关推荐

  1. 使用MD5加密数据库中的用户密码介绍

    使用MD5加密数据库中的用户密码介绍 ●前言 我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件.账号.密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特 ...

  2. php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...

    php中如何将execl的数据导入到数据库中 php导出大量数据的Excel: PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题 Excel可以支持100万行记录,Ex ...

  3. PHP实现单击“添加”按钮增加一行表单项,并将所有内容插入到数据库中

    PHP实现单击"添加"按钮增加一行表单项,并将所有内容插入到数据库中 效果图: html+jquery: <html> <head> <meta ht ...

  4. php如何导入数据,““php中如何将execl的数据导入到数据库中

    php中如何将execl的数据导入到数据库中 1.使用PHP Excel Parser Pro,但是这个软件为收费软件: 2.可EXCEL表保存为CSV,然后通过phpmyadmin或者SQLyog导 ...

  5. 从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中

    根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的.因此,提前考虑自己的数据库将选用哪一种字符集 是十分重要的.数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字 ...

  6. linux改用户密码chpasswd,Linux chpasswd (批量或单一修改用户密码)和passwd(直接修改用户密码)...

    Linux命令:chpasswd 批量或者单一修改用户密码 语法: 1:# echo 用户名:密码 | chpasswd 2:# chpasswd < doiido.txt 实例 1.直接修改d ...

  7. php使用excel表格数据库数据,php使用excel表格数据库数据库-php中如何将execl的数据导入到数据库中...

    php中如何将execl的数据导入到数据库中 1.使用PHP Excel Parser Pro软件,但是这件为收费软件: 2.可将EXCEL表保CSV,然后通过 phpmyadmin 或者SQLyog ...

  8. php 评论中添加手机表情,提示插入到数据库中出错,有解决办法

    最近在用手机上的表情对某一个文章进行评论时,发现插入到数据库的语句出错了, 就是插入表情的那一句出的错 具体的解决方法是: 文章评论表:articleComment,我需要向其中的content字段中 ...

  9. 加密数据的检索_透明地持久保存并从数据库中检索加密的数据

    加密数据的检索 自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集. 首先, Confitura的组织(欧洲最大的Java开发人员免费会议)参加了我所有的免费晚会,然后在 ...

最新文章

  1. html5模拟keyup事件
  2. python接口自动化测试一:http协议
  3. 我有一个朋友毕业后一直在腾讯
  4. python刚出来多少薪资-Python薪资待遇到底是多少?老男孩python学习
  5. Android的Intent系统调用
  6. github-markdown-css使用说明
  7. c语言银行排队系统链表,银行预约排队系统(数据结构问题)
  8. SQL Server 2005安装时提示“服务无法启动”
  9. 计算机操作系统安全序列详解,操作系统知识梳理
  10. WordPress 安装时常见的数据库的错误
  11. 不谋一时不足以谋一域_不谋万世者不足谋一时,不谋全局者不足谋一域是什么意思...
  12. js 迅雷 批量下载
  13. MySQL进阶:触发器
  14. 一米OA漏洞学习——getfile.jsp 任意文件读取漏洞
  15. 模型蒸馏探索(Bert)
  16. Cesium实践(4)——空间数据加载
  17. python 判断输入的字符,是字母,数字,还是其他字符
  18. IA-32汇编语言笔记(2)—— IA32处理器及其寄存器
  19. Wireshark3.4.8安装s7comm-plus插件
  20. leetcode---阶乘尾数

热门文章

  1. 51 《格鲁夫给经理人的第一课》 -豆瓣评分8.8
  2. 2015ccpc——G - Ancient Go
  3. 姿态角速度和机体角速度,横摆角速度(Yaw Rate)估算
  4. 攻防世界-Misc-新手练习记录
  5. 【报名有奖】相约2020 RT-Thread 开发者大会RDC
  6. 关于滑动时对背景动态高斯模糊的自定义控件
  7. Docker 容器技术(史上最强总结)
  8. ISP(图像信号处理)学习笔记-DPC坏点校正
  9. 关键应用在超融合环境下的实践
  10. linux 硬盘错误,linux – 硬盘读取错误……停止?