在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;
}

(0)

相关推荐

  • C#生成MD5的函数代码

    复制代码 代码如下: public static string GetMD5(string sDataIn)        {            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();            byte[] bytValue, bytHash;            bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn);         

  • PHP中MD5函数使用实例代码

    一般来说,一个提供会员注册的网站必定需要采集用户的密码,如何保存用户密码就是个问题.我们当然不能将密码以明文的方式储存在数据库中,因为这样的话,一般的管理员就可以查看到用户密码,显然对用户来说是件相当危险的事情. 那如何解决这个问题呢,我们可以采取这样的策略. 首先介绍一下PHP中MD5函数的使用方法: 复制代码 代码如下: <?php  $pswd1=md5("cenusdesign");  echo $pswd1;     //运行结果为:fc60ec37d1c08d5b0f

  • php md5下16位和32位的实现代码

    复制代码 代码如下: <?php   echo substr(md5("admin"),8,16);  // 16位MD5加密   echo "<hr>";   echo md5("admin");    // 32位MD5加密   ?> 16位的MD5加密用substr函数截取了字符得到实现.... 不想深入研究了 :)  要把脑力放到其他关键的地方~~ 今天做了个php链接mssql数据库,数据库中的表中字段使用MD5

  • C#读取文件MD5值的实现代码

    本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验. 我们知道可以通过将一个字符串进行散列(Hash)运算得到一个32位字符串,将其作为密码来保存是最常见的MD5应用.不知道大家有没有注意到,在网上一些下载文件的地方,旁边注明了MD5校验值,也是一个32位十六制字符串.这个字符串怎么用呢?这就是文件的MD5加密. 当我们将一个文件从网上下载之后 ,可以计算一下文件的MD5值,然后和网上公布的MD5值进行对比.结果一致,表示文件没有问题,如果结果不一致,有两种可能,

  • C#与PHP的md5计算结果不同的解决方法

    问题重现 这个 API 是当时给 Lyra 应用做激活用的,遂打开 Lyra 试了下,却发现一切正常,于是可以排除服务端的问题 放出导致错误的源码(来自 MSDN): public string CalculateMD5Hash(string input) { // step 1, calculate MD5 hash from input MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = Syste

  • php 的加密函数 md5,crypt,base64_encode 等使用介绍

    不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:string md5(string str); crypt() 将字符串用 UNIX 的标准加密 DES 模块加密.这是单向的加密函数,无法解密.欲比对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串.语法为:string crypt(string str, string [salt]); 可逆转的加密为:base64_encode().urlencode() 相对应的解

  • c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码

    复制代码 代码如下: using System; using System.IO; using System.Data; using System.Text; using System.Diagnostics; using System.Security; using System.Security.Cryptography; /**//* * .Net框架由于拥有CLR提供的丰富库支持,只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法.本类实现一些常用机密算法,供参考.其中MD5算

  • c#多种加解密示例(md5加密解密)

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Security.Cryptography;using System.Text; /// <summary>/// 加解密/// </summary>public static class CryptHelper{    #region RSA加密 /// &

  • 基于C#对用户密码使用MD5加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 /// <summary> /// 16位MD5加密 /// </summary> /// <param name="password"></param> /// <returns></returns&

  • 在C#中生成与PHP一样的MD5 Hash Code的方法

    最近在对一个现有的系统进行C#改造,该系统以前是用PHP做的,后台的管理员登陆用的是MD5加密算法.在PHP中,要对一个字符串进行MD5加密非常简单,一行代码即可: 复制代码 代码如下: md5("Something you want to encrypt.") 直接调用md5()方法,然后将要进行MD5加密的字符串传进去,就可以得到返回的hash code.在C#中应该也会有对应的算法吧!对吗?我首先尝试了下面的代码,结果得到的hash code和PHP不一样. 复制代码 代码如下:

  • Golang中生成随机字符串并复制到粘贴板的方法

    前段时间在生活中偶尔需要对某些文件进行重命名,而且是随机名字,刚 开始是手动重命名然后在键盘上胡乱打一些字母数字,时间长了发现也挺麻烦的,于是想到能不能用golang实现这个功能并且自动把生成的字符串 复制到粘贴板,然后生成exe文件,要用的是直接鼠标双击就行.说干就干. 网上搜了些相关资料,于是写了出来. 安装必要的库 go get github.com/atotto/clipboard 代码实现 package main import ( "fmt" "github.co

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • objective-c中生成随机数的方法

    本文简述objective-c中生成随机数的几种常见的方法,分享给大家,希望能给大家带来一点借鉴价值.具体如下: 1).arc4random()方法:比较精确不需要生成随即种子 使用方法如下 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc4random() % x; 获取1到x之间的整数的代码如下: int value = (arc4random() % x) + 1; 2).CCRANDOM_0_1()方法:在cocos2d中使用 ,范围

  • asp.net中生成饼状与柱状图实例

    本文实例讲述了asp.net中生成饼状与柱状图的实现方法.分享给大家供大家参考.具体方法如下: 一.生成图形的公共方法: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; // //using System.Data; //using System.Web.UI.WebControls; // using System.Drawing; using System.Drawing.Imagin

  • php中生成随机密码的自定义函数代码

    代码一: 生成一个随机密码的函数,生成的密码为小写字母与数字的随机字符串,长度可自定义.相对来说,这个比较简单 复制代码 代码如下: <?php/* * php自动生成新密码自定义函数(带实例演示)      适用环境: PHP5.2.x  / mysql 5.0.x* */function genPassword($min = 5, $max = 8)  {      $validchars="abcdefghijklmnopqrstuvwxyz123456789";     

  • Python中生成Epoch的方法

    在Python2中datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误.关于Epoch可以参见时区与Epoch 0 Python中生成Epoch from datetime import datetime # python3 datetime.now().timestamp() # python2 import time time.mktime(datetime.now().timetuple()) # 为了兼容python2和3,该用法使用

  • C#实现在购物车系统中生成不重复订单号的方法

    本文实例讲述了C#实现在购物车系统中生成不重复订单号的方法.分享给大家供大家参考.具体分析如下: 订单号在购物过程中起到了很好的识别作用,更方便的有利于工作人员识别商品,代码如下: #region 生成单据号 /// <summary> /// 生成单据号 /// </summary> /// <param name="pFromType"></param> /// <returns></returns> publ

  • nodejs密码加密中生成随机数的实例代码

    之前关于写了一个 nodejs密码加密中生成随机数,最近需要回顾,就顺便发到随笔上了 方法一: Math.random().toString(36).substr(2)运行后的结果就是11位数的随机数 方法二: 1.定义函数 function randomWord(randomFlag, min, max){ var str = "", range = min, arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',

  • 利用iText在JSP中生成PDF报表

    问题的由来 前不久做了一个通过JSP生成PDF报表的小项目,算得上开了一次眼界.企业的一些信息通过网络形成Html报表,虽然IE可以直接打印显示在其中的内容,但是从界面上来看,如果直接将Html的显示结果打印出来,显得不太美观.如果将它转成PDF文件再打印,则打印效果会好很多. iText简介 iText是一个开放源码的Java类库,可以用来方便地生成PDF文件.大家通过访问http://sourceforge.net/project/showfiles.php?group_id=15255&r

随机推荐