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

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

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

md5("Something you want to encrypt.")

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

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

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

  1. 实例化MD5CryptoServiceProvider对象

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

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

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

myByte.ToString("x2").ToLower()

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

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

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

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

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

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

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

public static long DateTimeToUnixTimeStamp(DateTime datetime)
{
    TimeSpan span = (datetime - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc));
    return (long)span.TotalSeconds;
}
时间: 2024-10-12 23:25:46

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

170120、java 如何在pdf中生成表格

1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110 生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf 通过读取properti

JAVA如何在eclipose中生成帮助文档

JAVA中注释有三种   1 单行注释 //+内容      2 多行注释  /* 内容 */  3 文档注释  /**内容*/       其中单行注释和多行注释是用于方法里面的注释 ,文档注释是用来注释类的成员和方法.   帮助文件是用多行注释实现的,用的程序是JAVA中jdk目录下bin目录JAVAdoc.exe. 首先 打开eclipose,找到一个需要生成帮助文档的工程.工程里面的类都是用多行注释标记了方法和属性的.比如 package java4_10; /** * * @autho

如何在excel中生成时间进度表——甘特图

最近学习软件工程需要做一个工程进度图.小小问题尽挡我数时,不服,终克之,辟一生路.在这与众友分享之. 具体步骤如下: 1.首先我们在excel中建一含有时间段的数据表. 2.选中包含时间段的属性列以及纵坐标属性列,如: 3.从菜单栏中选中插入-->条形图-->二维条形图-->堆积条形图,如 4.将生产的图表转换成图二形式.通过在图表区单击右键选择选择数据进入图二中选择数据源窗口,然后单击切换行/列得到图二所示.同时,将选择数据源中相应的行列属性名改为excel表中所示以确保同属性名(有利

在JavaScript中生成自定义的对象

使用对象便于组织信息.下面我们介绍如何在JavaScript中生成自定义的对象. ---------------------- JavaScript 对象 在前面几章中我们学到JavaScript中有些内置的对象,比如String, Date, Array等等.除此之外,你还可以定义自己的对象. 对象是一种特殊的数据,含有属性和函数. 下面让我们用一个例子来说明:比如一个人是一个对象.属性是与对象有联系的值,比如人的属性包括姓名,身高,体重,年龄,肤色,眼睛的颜色等等.所有人都有这些属性,但是每

Android NDK 在eclipse中生成C/C++头文件

我们知道在Android NDK开发中,让原生函数名及参数列表与java类文件的原始定义一致是繁杂而多余的,因为JDK自带一个名为javah的命令行工具来执行任务,javah工具可以为原生方法解析Java类文件并生成由原生方法声明组成的头文件.但是在开发中如果来回切换命令终端的话,可以说是很繁琐的,今天的这篇博文就来阐述一下如何在eclipse中生成头文件. (1)打开Eclipse IDE,在顶部菜单栏选择Run|External Tools|External Tools Configurat

linux中生成考核用的GPT分区表结构修复案例

目的:用于生成大量模拟破坏GPT分区结构案例,并生成唯一方式修复后的评判方法. 故障:在一个完整的GPT分区磁盘上,丢失了GPT主分区表,或备份分区表. 要求: 1.利用WINHEX手工方式,修复给定镜像文件的分区结构. 2.不得对现存主分区表或备份分区表做任何修改. 3.不得使用WINHEX GPT分区模板进行参考修复. 4.修复后生成整个镜像文件的MD5 HASH值. 实验样本生成过程: #!/bin/sh #删除头部做50个  for((i=1;i<=50;i++));do  r1=$((

浅析如何在Nancy中使用Swagger生成API文档

原文:浅析如何在Nancy中使用Swagger生成API文档 前言 上一篇博客介绍了使用Nancy框架内部的方法来创建了一个简单到不能再简单的Document.但是还有许许多多的不足. 为了能稍微完善一下这个Document,这篇引用了当前流行的Swagger,以及另一个开源的Nancy.Swagger项目来完成今天的任务! 注:Swagger是已经相对成熟的了,但Nancy(2.0.0-clinteastwood)和Nancy.Swagger(2.2.6-alpha)是基于目前的最新版本,但目

如何在FastReport.Net中生成标签类型报表

[下载FastReport.Net最新版本] 文本将介绍如何在FastReport.Net中生成标签类型报表,详细步骤如下所示: Add New Item -> Label Wizard 标签可以是bar codes(条形码),business cards(名片),addresses(地址),transport waybills(运单)等.它们可以用自粘纸或普通纸印刷.使用标签的内置FastReport模板或创建自己的模板.标签模板是一个报表模板,其中包含指定的页面大小和打印页面上的标签数量.

Java中生成帮助文档

如何在Java中使用注释 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上.因此,注释是程序源代码的重要组成部分,一定要加以重视哦! Java 中注释有三种类型:单行注释.多行注释.文档注释 运行结果:?Hello Imooc! 看:被注释的代码块在程序运行时是不会被执行的~~ 我们可以通过?javadoc?命令从文档注释中提取内容,生成程序的 API 帮助文档. 打开首页,查看下生成的 API 文档 PS: