md5概述与应用

md5是一种公开的不可逆算法。而不是一种加密算法(虽然其常被用来加密数据)。md5允许对小到一个字符,大到数G的文件进行运算。并得出一个唯一的由32位字符组成的值。其重码率小到只存在理论可能。
          一、md5是否可以被破解
         md5常被用于加密,或为数据进行安全认证。所以是否可以被破解一直被受讨论。
         首先,md5是不可逆算法,所以靠逆运算破解是不可能的,甚至不存在理论可能性。而如果进行穷举法破解,在无提示的情况下,需要数百年,因此只存在理论可能性。因此md5算法本身不可破解,只要应用合理,是决对安全的。
        关于md5被破解的报道,在论坛中常有关于md5被破解的报道。这里要弄清,有些人声称掌握了md5算法。那我只能恭喜这些人,因为md5算法是公开的,所以知道md5的运算规则只能说明你掌握了一门知识,是值得恭喜的。
        再一种情况是有人声称打开了经md5加密的文章。我很好奇,后来一打听,才知道他用他女友的生日,打开了他女友的日志。然后说自已破解了md5算法。我只能以“...”回应。因为他不是破解了md5,而是猜出了他女友使用的密码,在知道密码的情况下,当然是能打开的,别说是md5,就算是任何加密方法都没用。
       网上有一些专门破解md5的论坛和个人,而且有些是收费的。那么他们是如何破解的呢?
       他们使用的是穷举法,也就是我们俗称的暴破。你会问:“你不是说了吗?用穷举法存md5要上百年”。事实上如果密码很简单就可以暴破,比如,密码是6位数字,那只要用程序从000000~999999都试一遍就试出来了。这样的运算量计算机还是可以很快完成的。但是纯数字密码每增加1位运算量增加10倍。如果是英文和数字混排而且还有大小写区分。则每增加1位运算量增加62倍。这回明白有些网站要求密码是英文和数字混排了吧。
        二、md5的应用
       1.数据加密
       这几乎是最为人常用的用途。将用户设置的密码进行md5运算后存入数据库。当用户登录时,只需再求一次md5值,并与数据库中的值进行比对。判断密码是否正确就知道用户的合法性了。因为md5不可逆,所以即使数据库被突破或下载,也不可能知道用户密码。而这样带来的问题就是用户也不能找回密码,而只能在达成一定的条件后让用户重置密码。这就是为什么现在越来越多的网站不能找回密码,而只能重置密码。因为多数使用了不可逆算法(此处不只md5,也包括其它不可逆算法的应用).
        c#实例,用户注册与登录时的密码校验:
        注册时,假设用户在名为password的文本框中设置了密码,我们做如下运算:
        password.Text=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, "MD5");//对设置的密码求md5值,然后将这个值传入数据库存起来,就行了。
        当用户登录时,同样假设用户在名为password的文本框中设置了密码,只需再做如下运算
        password.Text=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, "MD5");//将这个值送入数据库进行比对,就知道登录时输入的密码和注册时输入的密码是否一样了

        2.数据校验
        因为md5的重码率低到只存在理论可能,因此常被用来校验数据是否被篡改。我们常见的,一些下载网站会给出文件的md5值,以供用户在下载后校验,因为即使在下载过程中,只改动了一个字节,其md5值也会改变。
        c#实例,求文件的md5值
        string filename="c:\\aa.text";//文件路径
        System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);//打开文件
        System.Security.Cryptography.HashAlgorithm md5 = System.Security.Cryptography.MD5.Create();
        filemd5 = BitConverter.ToString(md5.ComputeHash(fs)).Replace("-", "");//求md5值并转为32位字符串,这就是文件的md5值,也被称为文件指纹

        3.通讯安全
        通讯安全,是对数据校验的一种升级应用。因为md5算法是公开的,所以是兼容所有语言和系统,同一个数据,不同语言和不同系统求出来的值是一样的。所以可以应用此进行数据安全校验,防止数据在通讯中被伪造和篡改。比如网站引用支付宝的支付接口,那么网站和支付宝之间的通讯就是经过md5安全校验的。如果将md5应用到通讯安全则要在求算md5前设置一密钥,这个密钥只有你和支付宝知道。别人在不知道密钥的情况下是不可能伪造或篡改你发到支付宝的数据的。
        c#实例,将登录后的用户名,存在cookie中并用md5防止被篡改和伪造:
        我们假设用户名为"sa",我们将这个值存在cookie的"userid"字段上。
        我们设置一个密钥为"abc",这个密钥可以是任何字符串,只要自已知道就行了代码如下:
        当用户登录成功后,我们用如下代码设置cookie
        string key="abc";//设置密钥为"abc"
        System.Web.HttpContext.Current.Response.Cookies["userid"]="sa";//将用户名"sa"设置在cookie的"userid"字段上
        string md5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("sa"+key, "MD5");//将用户名与密钥一起求出md5值
        System.Web.HttpContext.Current.Response.Cookies["userid_md5"]=md5;//将md5值存在cookie的"userid_md5"字段上
        //以上完成了用户名的设置,注意千万别把密钥也设置进cookie里,那样用户就能看见密钥了
   
       当用户进行操作时,我们从cookie中读取用户名时先进行一次校验,以防止被伪造或篡改
       string key="abc";//密钥为"abc",保存时用的密钥与读取时用的密钥必需要同
       string userid=System.Web.HttpContext.Current.Request.Cookies["userid"];//从cookie中取出登录的id
       string md5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(userid+key, "MD5");//求这个ID与密钥的md5值
       //如果两次md5值不相等,则代表用户名被篡改
       if(md5!=(string)System.Web.HttpContext.Current.Request.Cookies["userid_md5"])
      {
           System.Web.HttpContext.Current.Response.Clear();
           System.Web.HttpContext.Current.Response.Write("MD5校验失败,您可能须要重新登录");
           System.Web.HttpContext.Current.Response.End();
      }
      //经过以上的检验如果登录名被修改,则会校验失败,这样可以防止通过伪造用户名登录
      一些安全性要求高的网站,不止有自已的类似md5那样的不可逆算法,甚至每个用户使用的密钥都不一样.


出处: http://hi.baidu.com/cty901/blog/item/50ac442e79fd674c4ec22604.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值