ASP.net 与ASP MD5加密结果不一致

今天准备用ASP.NET将原来的ASP应用程序重写,结果发现两者通过MD5加密的结果不一致(全英文没事,有汉字就不一样),网上有人说是二者所默认的编码不一样,前者是UFT-8,后者是GB2312,但我按照所说修改了默认编码以后还是不一样,请高手指教,谢谢

第1个回答  2013-07-16
要进行MD5加密的字符串不含中文时,那么ASP.NET的加密结果和ASP是一致的: Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("www.mzwu.com", "MD5"));
//结果:D66E1F138689B9B5AA4C520D9EAFFB61
Response.Write(MD5("www.mzwu.com",32))
'结果:d66e1f138689b9b5aa4c520d9eaffb61
当要进行MD5加密的字符串含中文时,两者的加密结果就不一致了:Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("木子屋", "MD5"));
//结果:34D9CBD5164C47058DFA3AF832E2D1DC Response.Write(MD5("木子屋",32))
'结果:0a40a90190da023ae7aa17771663a41e 我们知道,ASP.NET默认使用 utf-8编码格式,而ASP使用的是gb2312编码格式,正是由于这编码格式不同,才导致了两者对中文加密结果的不同。下边我们看看怎么让 ASP.NET的编码结果和ASP一样,那也就意味着要让ASP.NET采用gb2312编码格式,这点 FormsAuthentication.HashPasswordForStoringInConfigFile()方法是办不到的,我们得使用 System.Security.Cryptography.MD5CryptoServiceProvider对象的ComputeHash方法来进行 加密:MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
Response.Write(BitConverter.ToString(MD5.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes("木子屋"))).Replace("-", ""));
//结果:0A40A90190DA023AE7AA17771663A41E
若要再使用utf-8加密也非常容易:MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
Response.Write(BitConverter.ToString(MD5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes("木子屋"))).Replace("-", ""));
//结果:34D9CBD5164C47058DFA3AF832E2D1DC 问题似乎是比较完美的解决了,我们再 来完善一下:当要加密的字符串是从其他页面传进来时,其他页面采用的编码格式可能是gb2312,可能是utf-8,还可能是其他的编码格式,怎么解决 呢?你可能会觉得很简单啊,使用它先前的编码格式进行加密不就行了?实际测试中你会发现两个很严重的问题:1. 我们无从知道参数传过来时是使用什么编码格式;
2. 如果两个页面使用的编码方式不一样,那么Request接收到的参数值会乱码,那就不要谈加密了;问题1比较好解决,要求对方传参数的同时必须多加一个参数说明采用的编码格式,问题2的解决方法是不使用Request直接接收参数值,废话不多说了,看下边的函数:
/**//// <summary>
/// 对字符串进行MD5加密
/// </summary>
/// <param name="text">要加密的字符串</param>
/// <param name="charset">字符串编码格式</param>
/// <example>str = MD5("木子屋","gb2312");</example>
/// <returns></returns>
public string MD5(string text, string charset)
{
return (MD5(text, charset, false));
}

/**//// <summary>
/// 对字符串或参数值进行MD5加密
/// </summary>
/// <param name="text">要加密的字符串或参数名称</param>
/// <param name="charset">字符串编码格式</param>
/// <param name="isArg">加密字符串类型 true:参数值 false:字符串</param>
/// <returns></returns>
public string MD5(string text, string charset, bool isArg)
{
try
{
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();

if (isArg)
{
NameValueCollection Collect = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding(charset));//使用Collect接收参数值
if (Collect[text] != null)
{
return BitConverter.ToString(MD5.ComputeHash(Encoding.GetEncoding(charset).GetBytes(Collect[text].ToString()))).Replace("-", "");
}
}
else
{
return BitConverter.ToString(MD5.ComputeHash(Encoding.GetEncoding(charset).GetBytes(text))).Replace("-", "");
}
}
catch { }

return string.Empty;
}

说明1:上边代码需要引入的命名空间using System.Text;
using System.Web.Security;
using System.Security.Cryptography;
using System.Collections.Specialized;说明2:32位密文如何转化成16位?16位密文是32位密文的9到24位字符。如:"0a40a90190da023ae7aa17771663a41e"→"90da023ae7aa1777"
第2个回答  2013-07-16
这个问题是因为asp的md5加密对处理双字节的东西都有的问题,真正的加密过程是按章单字节来的,这样的话就需要你在你的dot net里面对asp的加密进行一下兼容
第3个回答  2013-07-16
以后不要问这么高深的问题知道吗?啊普!(:

ASP.net 与ASP MD5加密结果不一致
当要进行MD5加密的字符串含中文时,两者的加密结果就不一致了:Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("木子屋", "MD5"));\/\/结果:34D9CBD5164C47058DFA3AF832E2D1DC Response.Write(MD5("木子屋",32))'结果:0a40a90190da023ae7aa17771663a41e 我们知道,ASP.NET...

asp\/.net md5 加密结果 和PHP 的加密结果不一样
MD5 加密 貌似没有语言界限。1 你注意搞清楚 加密了几次 密文是区分大小写的 2 搞清楚 他们是不是 纯MD5加密 还是 加密后 只取了部分密文 3 明文中两边不要有空格 两种语言对空个处理可能有所不同 暂时想到这几种可能 希望对你有所帮助 ...

asp.net MD5密码加密后怎么读取比对?
把用户输入的密码也用同样的方法进行MD5加密后再跟数据库中的数据进行比对就行了。MD5加密后的数据在理论上是无法逆算出加密前的数据的,所以只能把要比对的数据都进行MD5加密后再进行比对。

哪位大侠能帮我这个md5加密的asp.net网站后台邓丽密码破解了 拜托...
别想了,你这个是非正常MD5加密,或者根本不是MD5加密,因为位数不对 ;如果你能确定他是用哪种加密算法,你只要用相同的算法加密一个你知道的密码,把这个值换成加密后的值就行了 ;http:\/\/www.cmd5.com\/ 不信你可以试试

asp.net MD5密码 怎么做 ,我用户Linq写了登录 代码 了,到底在哪个位置...
写入数据库之前MD5加密,然后写在数据库的就是MD5加密后的值 在登陆的时候进行判断时,将所输入的密码进行MD5加密再和数据库中提取的字段值进行比对,然后给于是否可以通过的提示!

ASP.NET的CMD5加密???
string 原始字符串 = "abc";string MD5加密后的字符串 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(原始字符串, "MD5");

把asp的md5加密文件翻译成C#程序文件
引用asp是不行的,不过你可以想办法让asp和asp.net配合工作,比如asp可以把结果提交到asp.net中来,你可以直接提交,也可以用ajax的方式。这是完全可行的。但你题目说md5,你是要把asp的md5翻译成.net的吗?md5算法可是都一样的。net里也有md5算法,计算结果和asp完全一样,当然有的asp md5的结果是...

我用asp.net 编程,如何将实现字符串如"adf你好123"和二进制数据之间的转...
如果在数据库加的密是可以解的,要是MD5加密的话,那就没办法了,以为MD5是不可逆的!

asp.net 给用户的密码加解密
1:加密:客户端加密:文本框中的文本-->MD5加密-->加上密钥-->MD5加密-->最终的字符串服务器加密:数据表中的密码字段(已经被MD5加密)-->加上密钥-->MD5加密-->最终的字符串 注意:客户端和服务器中的密钥一定要一致 我这有个CS文件和JS的MD5加密文件 ...

麻烦看看mysql表里的密码是用什么加密的
回答:1。有点似 base64_encode的在C#里有对应的的函数 要么就是用 discuz 的 authcode 加密函数。你可以上DISCUZ官方网站。找到ASP.NET的加密函数。但前提,你必须要要知道它的密钥。

相似回答
大家正在搜