关于神奇的MD5算法--21

1. MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种 保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位 的信息摘要。 
加密哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不 同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。所以你很难从加密后的文字中 找到蛛丝马迹.
2.SHA1的全称是Secure Hash Algorithm(安全哈希算法) ,MD5 算法的哈希值大小为 128 位。而SHA1 算法的哈希值大小为 160 位。两种算法都是不可逆。
虽说2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、 HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了 密码学界的轩然大波。但是我觉得对于我们做普通的软件来说,这个加密安全程度已经足够使用了。
我们平常用的最多的无非就是加密用户密码,把加密好的密码存储到数据库中,进行密码比较的时候,把用户输入的密码再进行加密,然后与数据库中的密文进行比较。至于asp.net类中是如何实现加密算法的,这个我们不需要关心,会用就行了。
下面就是Asp.net中几种加密方法。加密算法有两种,也就是上面提到的MD5和SHA1,这里我举的例子是以MD5为例,SHA1大致相同,只是使用的类不一样。
MD5 相关类: 
System.Security.Cryptography.MD5
System.Security.Cryptography.MD5CryptoServiceProvider()
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSource, "MD5")
SHA1相关类:
System.Security.Cryptography.SHA1
System.Security.Cryptography.SHA1CryptoServiceProvider()
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSource, "SHA1")
方法如下:

第一步:在HRMSys.DAL中新建一个MD5类,在其中新建一个方法GetMD5(string strSource).代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace HRMSys.DAL
{
    class MD5
    {
        public static string GetMD5(string strSource)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] bytValue, bytHash;
            bytValue = System.Text.Encoding.UTF8.GetBytes(strSource);
            bytHash = md5.ComputeHash(bytValue);
            md5.Clear();
            string sTemp="";
            for(int i=0;i<bytHash.Length;i++)
            {
                sTemp+=bytHash[i].ToString("X").PadLeft(2,'0');
            }
            return sTemp.ToLower();
        }
    }
}

第二步:在MainWindow中添加一个菜单为MD5加密,为其添加Click事件,代码如下:

  private void MD5_Click(object sender, RoutedEventArgs e)
        {

            string str = new MD5().GetMD5("123456");
            MessageBox.Show(str);
        }

运行预览即可。
这些加密函数都是在服务器端执行,也就是说,当用户输入密码后,从客户端到服务器端传输时,用户的密码没有任何保护,很危险。银行的做法是在客户端安装ActiveX控件,在客户端就把一些重要信息进行加密,再发送。

以下是在网络中找到的相关信息,进行参考。

private static string MD5Encryption(string str)
        {
            //创建一个MD5实例(MD5是个抽象类,不能new)
            MD5 md5 = MD5.Create();
            //将字符串转成byte[]
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
            //对byte[]进行加密
            byte[] encryptionBytes = md5.ComputeHash(bytes);
            //定义一个空字符串,接受加密后的MD5码
            string result = "";

            for (int i = 0; i < encryptionBytes.Length; i++)
            {
                //X的作用:变成16进制;如果长度是1,在前面加0
                result +=encryptionBytes[i].ToString("X").Length==1?"0"+encryptionBytes[i].ToString("X"):encryptionBytes[i].ToString("X");
            }
            return result;//MD5码
        }

 

对以上代码优化

/// <summary>
        /// 实现MD5加密
        /// </summary>
        /// <param name="str">要加密的字符串</param>
        /// <returns>加密后的MD5码</returns>
        private static string MD5EncryptionForNum(string str,string key)
        {
            string num = "";
            if(key.Length==0)
            {             
                //生成随机数
                Random random = new Random();
                //生成一个两位的随机数
                num = ((char)random.Next(65, 91)).ToString() + ((char)random.Next(65, 91)).ToString();
            }
            else
            {
                 num = key ;
            }
            //进行两次加密(当然了,你想使用几次都行,这你说的算)
            string result = num + MD5Encryption(num + MD5Encryption(str));
            //返回加密后的MD5码
            return result;
        }

 

 

 

posted @ 2013-06-10 23:30  秋水惜朝  阅读(308)  评论(0编辑  收藏  举报