`
qzriso
  • 浏览: 242947 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

彻底解决ASP.NET MD5加密中文结果和ASP不一致的问题

阅读更多

当要进行MD5加密的字符串不含中文时,那么ASP.NET的加密结果和ASP是一致的:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("www.mzwu.com""MD5")); 
//结果:D66E1F138689B9B5AA4C520D9EAFFB61

 

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Response.Write(MD5("www.mzwu.com",32))
'结果:d66e1f138689b9b5aa4c520d9eaffb61


当要进行MD5加密的字符串含中文时,两者的加密结果就不一致了:

 

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("木子屋""MD5")); 
//结果:34D9CBD5164C47058DFA3AF832E2D1DC

 

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Response.Write(MD5("木子屋",32))
'结果:0a40a90190da023ae7aa17771663a41e

 

 

我们知道,ASP.NET默认使用utf-8编码格式,而ASP使用的是gb2312编码格式,正是由于这编码格式不同,才导致了两者对中文加密结果的不同。下边我们看看怎么让ASP.NET的编码结果和ASP一样,那也就意味着要让ASP.NET采用gb2312编码格式,这点FormsAuthentication.HashPasswordForStoringInConfigFile()方法是办不到的,我们得使用System.Security.Cryptography.MD5CryptoServiceProvider对象的ComputeHash方法来进行加密:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
Response.Write(BitConverter.ToString(MD5.ComputeHash(Encoding.GetEncoding(
"gb2312").GetBytes("木子屋"))).Replace("-"""));
//结果:0A40A90190DA023AE7AA17771663A41E


若要再使用utf-8加密也非常容易:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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直接接收参数值,废话不多说了,看下边的函数:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/// <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"

 

 

分享到:
评论

相关推荐

    asp.net MD5加密

    ASP.NET中的MD5加密是一种广泛...总之,ASP.NET中的MD5加密虽然在安全性上已不被推荐,但在理解哈希函数和基础加密概念时仍具有学习价值。开发者应根据实际需求选择更适合的加密算法,并遵循最佳实践,确保数据安全。

    Asp.Net MD5加密程序dll版[32位加密](带示例演示)

    标签中的“Asp.Net MD5”和“MD5加密程序”进一步强调了这是一个针对Asp.Net平台的MD5加密解决方案。Asp.Net是Microsoft开发的一个Web应用程序框架,用于构建动态网站、Web应用和Web服务。MD5加密在这里用于保护敏感...

    asp.net使用MD5加密解密示例

    综上所述,ASP.NET通过MD5提供了一种加密和验证数据的方法,但鉴于MD5的安全性问题,建议使用更安全的替代方案。在实际项目中,我们需要根据需求选择合适的加密算法,并遵循最佳安全实践,以保护用户的敏感信息。

    ASP.NET的MD5和DES加密和解密算法

    ASP.NET的MD5和DES加密和解密算法 非常好的资源 欢迎大家参考

    【ASP.NET编程知识】.net core使用MD5加密解密字符串.docx

    在 ASP.NET Core 中,使用 MD5 算法来加密和解密字符串是非常重要的一步。MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于将任意长的数据转换为一个固定长度的密文。 在本文中,我们将介绍如何使用 ...

    ASP.Net(C#)+MD5加密演示

    ### ASP.NET (C#) + MD5 加密技术解析 #### 一、概述 在现代Web应用开发中,用户信息安全尤为重要。特别是在处理用户密码时,为了保护用户的隐私和数据安全,通常采用加密技术来存储密码而不是明文保存。本文将通过...

    asp.net常用函数表(最强)Md5加密

    ASP.NET是一种基于微软.NET ...综上所述,了解并熟练掌握ASP.NET中的MD5加密和网站打包技巧对于开发安全、高效的Web应用至关重要。通过这些技术,我们可以确保用户数据的安全性,同时也能方便地进行项目的部署和维护。

    Asp.Net校验MD5

    在Asp.Net中,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转化为固定长度的摘要,常用于数据完整性校验和密码存储。本文将详细探讨Asp.Net中如何进行MD5校验。 一、MD5原理 ...

    asp.net(C#)MD5数据加密和解密

    MD5加密,简单方便易用,我使用的是vs2010,所以,如果你使用的是vs2005 或vs2008,请新建一个空网站,将下载的文件解压后,(除confuger文件外)复制到你的空网站中就可使用!QQ:147249735,如有问题,可以Q我,...

    asp.net 密码加密实例

    在ASP.NET中使用MD5进行密码加密是基本的实践,但考虑到MD5的安全性问题,推荐使用更安全的算法如SHA-256或bcrypt。在实际应用中,结合盐值和多次迭代哈希可以进一步提高安全性。了解并正确实现这些概念对于任何ASP...

    ASP[1]NET实现MD5加密算法

    综上所述,ASP.NET实现MD5加密算法涉及到的主要知识点包括:ASP.NET平台的使用,C#编程语言,MD5哈希算法的原理和应用,以及在Web应用程序中安全存储用户密码的方法。同时,还需要了解SQL数据库的管理和DBA的相关...

    ASP.net中md5加密码的方法

    在提供的代码示例中,展示了如何在ASP.NET中使用MD5对字符串进行加密,分为两种方式:普通加密和密码方式加密。 1. **普通加密**: 在`Page_Load`事件处理程序中,首先获取`source.Text`的Unicode编码形式的字节...

    ASP.Net中的MD5加密

    ### ASP.NET中的MD5加密 #### 一、概述 在软件开发过程中,为了保护数据的安全性和完整性,常常需要对敏感信息进行加密处理。MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,可以将任意长度的数据...

    ASP.NET实现 DES加密解密类

    总之,ASP.NET中的DES加密解密涉及到对字符串数据的加密和解密,通过使用`DESCryptoServiceProvider`类,结合MD5哈希处理,实现了对数据的安全保护。尽管DES已不再是最安全的选择,但了解其原理和应用有助于理解加密...

Global site tag (gtag.js) - Google Analytics