Heim >php教程 >php手册 >如何在C#中生成与PHP一样的MD5 Hash Code

如何在C#中生成与PHP一样的MD5 Hash Code

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-06 19:40:101441Durchsuche

最近在对一个现有的系统进行C#改造,该系统以前是用PHP做的,后台的管理员登陆用的是MD5加密算法。在PHP中,要对一个字符串进行MD5加密非常简单,一行代码即可: md5 ("Something you want to encrypt.") 直接调用md5()方法,然后将要进行MD5加密的字符串传

  最近在对一个现有的系统进行C#改造,该系统以前是用PHP做的,后台的管理员登陆用的是MD5加密算法。在PHP中,要对一个字符串进行MD5加密非常简单,一行代码即可:

<span>md5</span>("Something you want to encrypt.")

  直接调用md5()方法,然后将要进行MD5加密的字符串传进去,就可以得到返回的hash code。在C#中应该也会有对应的算法吧!对吗?我首先尝试了下面的代码,结果得到的hash code和PHP不一样

<span>public</span> <span>static</span> <span>string</span> MD5(<span>string</span><span> stringToHash)
{
    </span><span>return</span> FormsAuthentication.HashPasswordForStoringInConfigFile(stringToHash, <span>"</span><span>md5</span><span>"</span><span>);
}</span>

  所以,我们不得不借用C#的MD5CryptoServiceProvider对象自己写代码进行转换。

  1. 实例化MD5CryptoServiceProvider对象

  2. 将字符串转换成byte数组

  3. 使用MD5CryptoServiceProvider对象的ComputeHash()方法将byte数组进行加密,返回转换后的byte数组

  4. 在讲byte数组转换成字符串之前,还需要对其进行遍历并做如下转换:

myByte.ToString(<span>"</span><span>x2</span><span>"</span>).ToLower()

  然后,你才能得到和PHP中一样的MD5 hash code。为什么在.NET中要这么麻烦,或许这也是为什么那么多的开发人员仍然热衷于PHP开发的理由之一,每一门编程语言都有它自身的魅力,也都有它存在的意义!

  基于上面的讨论,完整的代码如下:

<span>public</span> <span>static</span> <span>string</span> MD5ForPHP(<span>string</span><span> stringToHash)
{
    </span><span>var</span> md5 = <span>new</span><span> System.Security.Cryptography.MD5CryptoServiceProvider();
    </span><span>byte</span>[] emailBytes =<span> Encoding.UTF8.GetBytes(stringToHash.ToLower());
    </span><span>byte</span>[] hashedEmailBytes =<span> md5.ComputeHash(emailBytes);
    StringBuilder sb </span>= <span>new</span><span> StringBuilder();
    </span><span>foreach</span> (<span>var</span> b <span>in</span><span> hashedEmailBytes)
    {
        sb.Append(b.ToString(</span><span>"</span><span>x2</span><span>"</span><span>).ToLower());
    }
    </span><span>return</span><span> sb.ToString();
}</span>

  或者,你也可以把上面的方法写成一个C#扩展方法,只需要修改方法签名即可。

<span>public</span> <span>static</span> <span>string</span> MD5ForPHP(<span>this</span> String, <span>string</span><span> stringToHash)
{
    </span><span>//</span><span> Your code here.</span>
}

  PHP程序和C#程序在许多方面都会涉及到格式之间的转换,如果运行PHP的服务器是UNIX类型的,则还会存在日期格式之间的转换。下面的两个方法展示了如何将UNIX时间转换成C# DateTime以及如何将C# DateTime转换成UNIX时间。

<span>public</span> <span>static</span> DateTime UnixTimeStampToDateTime(<span>long</span><span> unixTimeStamp)
{
    </span><span>//</span><span> Unix timestamp is seconds past epoch</span>
    DateTime dtDateTime = <span>new</span> DateTime(<span>1970</span>, <span>1</span>, <span>1</span>, <span>0</span>, <span>0</span>, <span>0</span>, <span>0</span><span>, System.DateTimeKind.Utc);<br></span><span>    return</span><span> dtDateTime.AddSeconds(unixTimeStamp);
}

</span><span>public</span> <span>static</span> <span>long</span><span> DateTimeToUnixTimeStamp(DateTime datetime)
{
    TimeSpan span </span>= (datetime - <span>new</span> DateTime(<span>1970</span>, <span>1</span>, <span>1</span>, <span>0</span>, <span>0</span>, <span>0</span>, <span>0</span><span>, DateTimeKind.Utc));
    </span><span>return</span> (<span>long</span><span>)span.TotalSeconds;
}</span>

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn