第三天 -- 《2014-07-18 三层架构》2 -- MD5、删除记录、更新记录

一、下午《01、新增时添加地区信息》--《03、winform中自带方法实现md5加密》

1、MD5概念

  MD5即Message-Digest Algorithm 5(中文名为消息摘要算法第五版),为计算机安全领域广泛使用的一种散列函数,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

MD5算法特点:
<1>压缩性:任意长度的数据,算出的MD5值长度都是固定的。(32个字符)
<2>容易计算:从原数据计算出MD5值很容易。
<3>抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
<4>强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的

MD5用途:
<1>一致性验证
文本或文件的MD5值就像是这个文件的“数字指纹”。每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。所以MD5可以用来验证文件一致性。
<2>数字签名
正因为可以验证文件一致性,所以可以防止文件篡改者抵赖。起到数字签名的作用。
<3>安全访问认证
MD5广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。

 

2、MD5的C#代码

 1 public static string GetMD5Form(string pwd)
 2 {//获取密码明文的MD5码
 3     MD5 md5 = MD5.Create();//实例化MD5对象
 4     byte[] bytes = Encoding.Default.GetBytes(pwd);//获得字符串默认编码的字节数组
 5     bytes = md5.ComputeHash(bytes);
 6     StringBuilder sb = new StringBuilder();
 7     for (int i = 0; i < bytes.Length; i++)
 8     {
 9         sb.Append(bytes[i].ToString("X2"));//将字节数组内容以两位十六进制大写字符形式输出。如:01 02 0A FF 10 1A...
10     }
11     return sb.ToString();
12 } 

 

3、怎么才能破解MD5码

  MD5码是将数据(文本或文件)当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。也就是说依据32个字符的MD5码,无论如何也还原不出来原始文本(更不可能还原出原始文件、小电影等等)。所以这样来讲,MD5不能算是一种加密,而是数字签名。

  但是除了广泛应用于文件下载后的一致性检查(看看文件是否在下载过程中,下载后被篡改),MD5还广泛用于“加密”用户密码,验证用户登录。如:将用户注册时输入的密码获取其MD5码存入数据库(存入MD5码即使泄漏也无法还原出用户密码)。以后每次验证用户登录时,将输入的密码获取其MD5码与数据库比对即可。

  既然MD5不是加密算法,那就不存在破解一说。但是用MD5得到的数字签名(32个字符),我们仍然可以通过大量的“穷举”、“跑字典”去验证登录(现在有种叫“杂凑冲撞”)。所以很多重要的登录验证场合会限制用户“try”的次数(不过以现在的CPU速度,复杂密码try出来的时间是个天文数字)

 

  穷举破解MD5码验证登录要多长时间?

大小写字母+数字总共有26+26+10=62中字符(这里先定义“a^b”表示a的b次方)。
则从1位到11位所包含的所有的密码的数量为:62^1+62^2+62^3+……+62^11=52 889 619 055 703 278 000条密码。
然后,在INTEL CORE T7100 1.8GHz的CPU下,用一个核心,破解速度可以达到4 000 000条密码/秒。
这样,要穷举上面所说的范围,所用的时间就是:
52 889 619 055 703 278 000
---------------------------————  = 13 222 404 763 926秒
4 000 000
换算下来,也就是425103年零12天4小时12分6秒。也就是说即使密码里面不包含标点符号且密码长度不超过11个字符,运气不好的话也要try几十万年。

所以说MD5方式一般场合验证登录密码还是安全的。

 

二、下午《04、实现人员信息的删除》

1、选中DataGridView行,获取行的绑定实体对象(即this.dgvList.CurrentRow.DataBoundItem  as  MODEL.Person)。获取实体对象Id

2、调用BLL层Delete(Id)方法,将Id作为参数传递。最终调用DAL层Delete(Id)方法。

3、DAL层Delete(Id)方法内写删除记录(或者更新isDel标志列)的sql语句和SqlParameter参数,最后调用SqlHelper.ExecuteNonQuery方法提交sql给服务器执行。

 

三、下午《05、修改时填充控件的数据》--《07、实现修改操作》

1、选中DataGridView行,获取行绑定的实体对象。点击“修改按钮”打开修改UI(实际上修改UI和新增UI可以复用,但是要做好标识——是新增还是修改)

2、将实体对象的属性显示在修改UI各控件上。

3、用户点击保存时将修改UI上的信息对实体对象赋值。最后调用BLL层Update(实体)方法,最终调用DAL层Update方法。

4、DAL层Update方法内写更新的sql语句和SqlParameter参数,最后调用SqlHelper.ExecuteNonQuery方法提交sql给服务器执行。

 

posted on 2017-08-28 13:01  困兽斗  阅读(129)  评论(0)    收藏  举报

导航