2006年12月10日

c#示例
public string md5(string str,int code)
{
if(code==16) //16位MD5加密(取32位加密的9~25字符)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower().Substring(8,16) ;
}
else//32位加密
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower();
}
}

posted @ 2006-12-10 14:57 董文超 阅读(210) | 评论 (1)编辑

     摘要: 以下为MD5算法用c#的实现//MD5.cs//MD5 16-bit,32-bits algorithm implemented in C#using System;using System.Text;namespace Encrypter{/// <summary>/// Summary description for MD5./// </summary>public c... 阅读全文

posted @ 2006-12-10 13:10 董文超 阅读(163) | 评论 (2)编辑

我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件、账号、密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特殊栏目提供的信息或者服务,比如免费电子邮件、论坛、聊天等,都需要用户注册。而对于电子商务网站,比如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的实际使用。
在前面的介绍中,我们提到网站往往将用户的账号、密码等信息使用非加密的方式保存到数据库,比如账号使用类型为VarChar的UserCount字段,同样,密码也是采用类型为VarChar的Password字段。但是,如果我们打算采用MD5加密方式存储密码信息,就必须改变密码字段PassWord的类型为16为二进制方式,这个其实我们也不难理解,因为在前面的介绍中,我们知道加密以后的输出,是使用二进制数组的,所以,这里必须做相应的改变。

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

<%@ Import Namespace="System.Security.Cryptography" %>

<%@ Import Namespace="System.Text" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat="server" language="VB">

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

</script>


<form runat="server">

<h1>建立一个账号</h1>

用户名:<asp:TextBox runat="server" id="txtUsername" />

<br />密码:

<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />

<p><asp:Button runat="server" Text="建立用户账号"

OnClick="CreateAccount" /></p>

</form>


  在以上程序实现的页面中,“用户名”和“密码”输入框要求用户输入自己的账号和密码,用户输入自己的信息以后,按“建立用户账号”按钮,就可以建立一个账号并且存入数据库。我们同时需要特别注意,因为以上的程序使用到了MD5加密和数据库等功能,所以,在代码最开头,我们引入了几个稍微特别一点的名字空间,这是不可缺少的。
  我们可以看到,PassWord字段的信息是二进制方式保存的,即使数据库被人取得,也不可能知道密码具体是什么意思。当然,密码也就不会泄露。
既然用户密码是按照MD5加密以后保存在数据库中的,我们知道,MD5是单次加密算法,所以,不可能将加密以后的信息转为明文,也就是说,已经没有办法知道。这就出现一个问题,如果用户使用账号、密码登录,怎么知道用户提供的密码是否准确呢?

  这就不得不提到我们前文说到的MD5的特征,我们知道,任意一段明文数据,经过加密以后,其结果必须永远是不变的,也就是说,如果需要验证用户密码是否正确,只需要将用户当前提供的密码使用MD5加密,然后和数据库中保存的密码字段比较就可以了。以下代码就可以实现这个功能:

<%@ Import Namespace="System.Security.Cryptography" %>

<%@ Import Namespace="System.Text" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script runat="server" language="VB">

Sub Login(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 = "SELECT COUNT(*) FROM UserAccount " & _

"WHERE Username=@Username AND Password=@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 hashedDataBytes as Byte()

Dim encoder as New UTF8Encoding()


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


Dim paramPwd as SqlParameter

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

paramPwd.Value = hashedDataBytes

objCmd.Parameters.Add(paramPwd)


objConn.Open()

Dim iResults as Integer = objCmd.ExecuteScalar()

objConn.Close()


If iResults = 1 then

'正确

Else

'错误

End If

End Sub

</script>


<form runat="server">

<h1>Login</h1>

用户账号: <asp:TextBox runat="server" id="txtUsername" />

<br />密码:

<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />

<p><asp:Button runat="server" Text="Login" OnClick="登录" />

</form>


使用加密方式保存密码到数据库的限制

  在决定是否使用加密方式保存密码以前,我们还需要考虑一些问题。因为MD5是单次加密算法,加密以后的信息不可以解密,所以,如果用户丢失密码,任何人都很难找到用户原来的密码,这时候,网站也就相应的失去一个很重要的功能,那就是用户提供其他信息来取得忘记的密码的功能,这不能不说是网站的一个大缺陷。另外,采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册,这也是这种方法比较困难的一个地方。


总结

  以上我们详细介绍了MD5加密用户密码的实现方法,同时,也介绍了采用加密密码方式以后,用户鉴别的实现。并讨论了使用这种加密方式的应用限制。在实际应用中,我们可以将次方法做适当的修改和补充,以更加适合我们的应用需要。

posted @ 2006-12-10 12:47 董文超 阅读(125) | 评论 (1)编辑


2006年10月21日

//——-Coding
Ctrl+K, Ctrl+M
Surroun Ctrl+K, Ctrl+S
Code snippet Ctrl+K, Ctrl+X

注释 Ctrl+K, Ctrl+C
remove注释 Ctrl+K, Ctrl+U
Clipboard内容循环 Ctrl+Shift+V

删除当前行 Ctrl+Shift+L

自动换行 Ctrl+E, Ctrol+W

大小写 Ctrl+Shift+U, Ctrl+U

Navigation backward Ctrl+-
Navigation forward Ctrl+Shift+-
//——-Refactor
Rename Ctrl+R, Ctrl+R

//——-Search
渐进式搜索 Ctrl+I
反向渐进式搜索 Ctrl+Shift+I

//——-各种窗口
Command window Ctrl+Alt+A
Show breakpoints window Ctrl+Alt+B
Solution explore Ctrl+Alt+L
Code Definition window Ctrl+\, Ctrl+D

Exceptions Ctrl+Alt+E
Attach to Process Ctrl+Alt+P
Task List Ctrl+\,Ctrl+T
Error List Ctrl+\,Ctrl+E
Toolbox Ctrl+Alt+T
Class Ctrl+Shift+C

Macro Explore Alt+F8

//——-Bookmark
Bookmark window Ctrl+K, Ctrl+W
Toogle Bookmark Ctrl+K, Ctrl+K
Next Bookmark Ctrl+K, Ctrl+N
Previous Bookmark Ctrl+K, Ctrl+P
Clear Bookmarks Ctrl+K, Ctrl+L
Add Task List Ctrl+K, Ctrl+H
Remove Task List Ctrl+K, Ctrl+H

//——-Format
Format Ctrl+K, Ctrl+D

//——-Breakpoint
New breakpoint Ctrl+D
Clear all breakpoints Ctrl+Shift+F9

//——-VS
全屏 Shift+Alt+Enter
切换active file Ctrl+Tab
Open file Ctrl+O
New file Ctrl+N
New project Ctrl+Shift+N

 

posted @ 2006-10-21 01:21 董文超 阅读(198) | 评论 (0)编辑

新建文档        Ctrl+N
  打开一个 HTML文件   Ctrl+O或者将文件从[文件管理器]或[站点]窗口拖动到[文档]窗口中
  在框架中打开       Ctrl+Shift+O
  关闭           Ctrl+W
  保存           Ctrl+S
  另存为         Ctrl+Shift+S
  检查链接        Shift + F8
  退出          Ctrl+Q

  编辑菜单

  撤消          Ctrl+Z
  重复          Ctrl+Y 或 Ctrl+Shift+Z
  剪切          Ctrl+X 或Shift+Del
  拷贝          Ctrl+C 或Ctrl+Ins
  粘贴          Ctrl+V 或Shift+Ins
  清除          Delete
  全选          Ctrl+A
  选择父标签       Ctrl+Shift+<
  选择子标签       Ctrl+Shift+>
  查找和替换       Ctrl+F
  查找下一个       F3
  缩进代码         Ctrl+Shift+]
  左缩进代码       Ctrl+Shift+[
  平衡大括弧       Ctrl+’
  启动外部编辑器     Ctrl+E
  参数选择        Ctrl+U

 页面视图

  标准视图        Ctrl+Shift+F6
  布局视图        Ctrl+F6
  工具条         Ctrl+Shift+T

  查看页面元素

  可视化助理       Ctrl+Shift+I
  标尺          Ctrl+Alt+R
  显示网格        Ctrl+Alt+G
  靠齐到网格       Ctrl+Alt+Shift+G
  头内容         Ctrl+Shift+W
  页面属性        Ctrl+Shift+J

  代码编辑

  切换到设计视图     Ctrl+Tab
  打开快速标签编辑器   Ctrl+T
  选择父标签       Ctrl+Shift+<
  平衡大括弧       Ctrl+’
  全选          Ctrl+A
  拷贝          Ctrl+C
  查找和替换       Ctrl+F
  查找下一个       F3
  替换          Ctrl+H
  粘贴          Ctrl+V
  剪切          Ctrl+X
  重复          Ctrl+Y
  撤消          Ctrl+Z
  切换断点        Ctrl+Alt+B
  向上选择一行      Shift+Up
  向下选择一行      Shift+Down
  选择左边字符      Shift+Left
  选择右边字符      Shift+Right
  向上翻页        Page Up
  向下翻页        Page Down
  向上选择一页      Shift+Page Up
  向下选择一页      Shift+Page Down
  选择左边单词      Ctrl+Shift+Left
  选择右边单词      Ctrl+Shift+Right
  移到行首        Home
  移到行尾        End
  移动到代码顶部     Ctrl+Home
  移动到代码尾部     Ctrl+End
  向上选择到代码顶部   Ctrl+Shift+Home
  向下选择到代码顶部   Ctrl+Shift+End

  编辑文本

  创建新段落       Enter
  插入换行
      Shift+Enter
  插入不换行空格     Ctrl+Shift+Spacebar
  拷贝文本或对象到页面其他位置   Ctrl+拖动选取项目到新位置
  选取一个单词      双击
  将选定项目添加到库   Ctrl+Shift+B
  在设计视图和代码编辑器之间切换   Ctrl+Tab
  打开和关闭[属性]检查器 Ctrl+Shift+J
  检查拼写         Shift+F7

 格式化文本

  缩进          Ctrl+]
  左缩进         Ctrl+[
  格式>无         Ctrl+0 (零)
  段落格式        Ctrl+Shift+P
  应用标题1到6到段落   Ctrl+1 到 6
  对齐>左对齐       Ctrl+Shift+Alt+L
  对齐>居中        Ctrl+Shift+Alt+C
  对齐>右对齐       Ctrl+Shift+Alt+R
  加粗选定文本      Ctrl+B
  倾斜选定文本      Ctrl+I
  编辑样式表       Ctrl+Shift+E

  查找和替换文本

  查找          Ctrl+F
  查找下一个/再查找    F3
  替换          Ctrl+H

  处理表格

  选择表格(光标在表格中) Ctrl+A
  移动到下一单元格    Tab
  移动到上一单元格    Shift+Tab
  插入行(在当前行之前) Ctrl+M
  在表格末插入一行 在最后一个单元格    Tab
  删除当前行       Ctrl+Shift+M
  插入列         Ctrl+Shift+A
  删除列         Ctrl+Shift+ - (连字符)
  合并单元格       Ctrl+Alt+M
  拆分单元格       Ctrl+Alt+S
  更新表格布局(在“快速表格编辑”模式中强制重绘)  Ctrl+Spacebar

  处理框架

  选择框架        框架中Alt+点击
  选择下一框架或框架页  Alt+右方向键
  选择上一框架或框架页  Alt+左方向键
  选择父框架       Alt+上方向键
  选择子框架或框架页   Alt+下方向键
  添加新框架到框架页   Alt+从框架边界拖动
  使用推模式添加新框架到框架页  Alt+Ctrl+从框架边界拖动

  处理层

  选择层         Ctrl+Shift+点击
  选择并移动层      Shift+Ctrl+拖动
  从选择中添加或删除层  Shift+点击层
  以象素为单位移动所选层 上方向键
  按靠齐增量移动所选层  Shift+方向键
  以象素为单位调整层大小 Ctrl+方向键
  以靠齐增量为单位调整层大小  Ctrl+Shift+方向键
  将所选层与最后所选层的顶部/底部/左边/右边对齐  Ctrl+上/下/左/右方向键
  统一所选层宽度     Ctrl+Shift+[
  统一所选层高度     Ctrl+Shift+]
  创建层时切换嵌套设置  Ctrl+拖动
  切换网格显示      Ctrl+Shift+Alt+G
  靠齐到网格       Ctrl+Alt+G

 处理时间轴,图象

  添加对象到时间轴    Ctrl+Alt+Shift+T
  添加关键帧       Shift+F9
  删除关键帧       Delete
  改变图象源文件属性   Double+点击图象
  在外部编辑器中编辑图象 Ctrl+双击图象

  管理超链接

  创建超链接(选定文本) Ctrl+L
  删除超链接        Ctrl+Shift+L
  拖动并投放以从文档创建超链接 选取文本,图象或对象,然后Shift+拖动选择到[站点]窗口中的文件
  拖动并投放以使用[属性]检查器创建超链接 选取文本,图象或对象,然后拖动[属性]检查器的指向文件图表到[站点]窗口的文件
  在Dreamweaver打开链接文档  Ctrl+双击链接
  检查选定链接      Shift+F8
  检查整个站点中的链接  Ctrl+F8

  在浏览器中定位和预览

  在主浏览器中预览    F12
  在次要浏览器中预览   Ctrl+F12

  在浏览器中调试

  在主浏览器中调试    Alt+F12
  在次要浏览器中调试   Ctrl+Alt+F12

  站点管理和FTP

  创建新文件       Ctrl+Shift+N
  创建新文件夹      Ctrl+Shift+Alt+N
  打开选定        Ctrl+Shift+Alt+O
  从远程FTP站点下载选定文件或文件夹  Ctrl+Shift+D或将文件从[站点]窗口的[远程]栏拖动到[本地]栏
  将选定文件或文件夹上载到远程FTP站点  Ctrl+Shift+U或将文件从[站点]窗口的[本地]栏拖动到[远程]栏
  取出          Ctrl+Shift+Alt+D
  存回          Ctrl+Shift+Alt+U
  查看站点地图      Alt+F8
  刷新远端站点      Alt+F5

  站点地图

  查看站点文件      F8
  刷新本地栏       Shift+F5
  设为根         Ctrl+Shift+R
  链接到现存文件     Ctrl+Shift+K
  改变链接        Ctrl+L
  删除链接        Delete
  显示/隐藏链接      Ctrl+Shift+Y
  显示页面标题      Ctrl+Shift+T
  重命名文件       F2
  放大站点地图      Ctrl+ + (plus)
  缩小站点地图      Ctrl+ - (hyphen)

  播放插件

  播放插件        Ctrl+Alt+P
  停止插件        Ctrl+Alt+X
  播放所有插件      Ctrl+Shift+Alt+P
  停止所有插件      Ctrl+Shift+Alt+X

  处理模板

  创建新的可编辑区域   Ctrl+Alt+V

  插入对象

  任何对象(图象,Shockwave影片等)  文件从[资源管理器]或[站点]窗口拖动到[文档]窗口
  图象          Ctrl+Alt+I
  表格          Ctrl+Alt+T
  Flash影片        Ctrl+Alt+F
  Shockwave和Director影片  Ctrl+Alt+D
  命名锚记        Ctrl+Alt+A

  历史纪录面板

  打开[历史纪录]面板   Shift F10
  开始/停止录制命令    Ctrl+Shift+X
  播放录制好的命令    Ctrl+P

  打开和关闭面板

  对象          Ctrl+F2
  属性          Ctrl+F3
  站点文件        F5
  站点地图        Ctrl+F5
  资源          F11
  CSS样式         Shift+F11
  HTML样式        Ctrl+F11
  行为          Shift+F3
  历史纪录        Shift+F10
  时间轴         Shift+F9
  代码检查器       F10
  框架          Shift+F2
  层           F2
  参考          Ctrl+Shift+F1
  显示/隐藏浮动面板    F4
  最小化所有窗口     Shift+F4
  最大化所有窗口     Alt+Shift+F4

  获得帮助

  使用Dreamweaver[帮助主题]   F1
  参考           Shift+F1
  Dreamweaver支持中心   Ctrl+F1

posted @ 2006-10-21 00:44 董文超 阅读(108) | 评论 (1)编辑


posts - 6, comments - 3, trackbacks - 3, articles - 0

Copyright © 董文超