ASP.NET实现MD5加密算法

来源:互联网 发布:淘宝兼职怎么做 编辑:程序博客网 时间:2024/05/20 18:52
其实在.net 有一个最简单实现MD5的方法
        <summary>
        /// MD5加密
        /// </summary>
        /// <param name="toCryString">被加密字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string MD5(string toCryString)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(toCryString, "MD5");
        }

public static string MD5(string str)
  {
   MD5 md5 = new MD5CryptoServiceProvider();
   byte[] result = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(str));
   string str2 = "";
   for(int i=0;i<result.Length;i++)
   {
    str2 += string.Format("{0:x}",result[i]);
   }
   return str2;
  }

/// <summary>
  ///对字符串进行MD5编码*/
  ///返回值:编码后的MD5密码串
  ///输入:预加密的原字符串
  /// </summary>
  /// <param name="xStr"></param>
  /// <returns></returns>
  public static string SysEncode(string xStr)
  {
   string str = "";
   try
   {
    //字符串前加pz标识    
    xStr = "pz" + xStr;    
    str =  System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(xStr,"md5").ToString();
  
   }
   catch
   {    
    str =  "";    //error
   }
   return str;     //返回加密后的字符串
  }


结算加密出来的结果,写java,php,asp等标准算法不同!
其实在.net 有一个最简单实现MD5的方法
/**//// <summary>
        /// MD5加密
        /// </summary>
        /// <param name="toCryString">被加密字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string MD5(string toCryString)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(toCryString, "MD5");
        }
那么,从byte到字符串的标准转法怎么转呢,我看了,Quickstart用的是
BitConverter.ToString
这样标准md5写法要写成!
public static string MD5(string toCryString)
        {
            MD5CryptoServiceProvider hashmd5;
            hashmd5 = new MD5CryptoServiceProvider();
            return BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(toCryString))).Replace("-","").ToLower();//asp是小写,把所有字符变小写
        }
结果加密出来的内容,和标准的一样了!

这个问题我已经解决了,在上次CSDN服务器出问题以前,我发过帖子。

因为现在在一般Asp下使用的MD5算法,使用的是老外写的一个vbScript算法,他内部使用的是16位算法,而.net算法天生就是32位的。

大概我上面的解释不对,但是可以确定一点,就是asp下的md5算法与.net下的自带算法是不兼容的。没有任何办法可以让他们所出的结果一致。

不过有个变通的法子。原理是在ms平台上,所有的脚本语言,包括vbScript,JavaScript和JScript,都是使用同一个脚本处理器,名称是ScriptHost,在微软官方下载站搜索Script56就可以找到。对这个ScriptHost,微软推出了一个Com组件,这个组件专门经过处理,可以供.net的运行库通过它可以调用并控制这个ScriptHost。

利用上面的法子,在asp.net站点上,安装这个控制器,就可以调用ScriptHost。

调用过程是,首先在
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033
处下载微软的官方ScriptHostControl控件,然后安装,安装完毕后。打开vs.net,然后在项目的解决方案资源管理器中选择项目的"引用"节点,选择添加引用,然后定位到刚才安装时选择的目录中的msscript.ocx文件。

然后把asp中,计算md5的算法代码(注意不能包含Response,Request这样的asp专用对象)复制到一个vbs文件中。在vs.net中写代码使用StreamReader类把这个vbs文件读取到一个字符串变量中,然后调用刚才的引用对象控制ScriptHost,把vbs代码赋于这个host,然后读取结果,即可得到与asp同样的结果。

我已经写好了示例文档,包括一个asp下的md5算法vbScript脚本文件,一个asp.net页面和相对的.cs文件。压缩包内还包括了ScriptControl这个ActiveX控件,如果不相信我,可以到上面的微软地址去下载。
示例下载在:http://submaie.aspsir.com/temp/CSharpRunScript.rar


ASP中MD5的加密对于英文字母或数字(既单字节),与ASP.NET中的算法结果是一样的。

不同指出是:ASP中的MD5普通是小写,.NET中是大写。

如果你的ASP加密结果是16位的,估计你使用的动网论坛的那个MD5类。动网论坛只取了,32位 MD5 的中间16位。这时候可以更改ASP的MD5类(只是最后一句话"MD5=LCase(WordToHex(b) & WordToHex(c))"改成"LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))")。实现ASP中的结果也是32位。或者取.NET加密结果的时候只取中间16位。


如果是因为双字节问题。恐怕没有什么太好的解决办法。单字节的话,无论.NET/JAVA/ASP/PHP的MD5都是一样的。

 
原创粉丝点击