php md5算法,给出与c#相同的结果

我在C#中有一个散列算法,简而言之,它是:

string input = "asd"; System.Security.Cryptography.MD5 alg = System.Security.Cryptography.MD5.Create(); System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); byte[] hash = alg.ComputeHash(enc.GetBytes(input)); string output = Convert.ToBase64String(hash); // outputs: eBVpbsvxyW5olLd5RW0zDg== Console.WriteLine(output); 

现在我需要在php中复制这种行为,

 $input = "asd"; $output = HashSomething($input); echo $output; 

我怎样才能实现它?

我检查了

  • MD5
  • utf8_decode
  • 函数utf8_encode
  • BASE64_ENCODE
  • BASE64_DECODE
  • url_decode

但我注意到php md5最终没有得到==我错过了什么?

注意 :我无法更改C#行为,因为它已经实现,并且使用此算法将密码保存在我的数据库中。

问题是PHP的md5()函数默认返回散列的hex变体,其中C#返回原始字节输出,然后必须使用base64编码使文本安全。 如果您运行的是PHP5,则可以使用base64_encode(md5('asd', true)) 。 注意md5()的第二个参数是true,这使得md5()返回原始字节而不是hex。

你还记得在php中使用base64编码md5哈希吗?

$result = base64_encode(md5($password, true));

第二个参数使md5返回原始输出,这与您在C#中使用的函数相同

您的C#代码从字符串中获取UTF8字节; 计算md5并存储为base64编码。 所以你应该在php中做同样的事情,应该是:

 $hashValue = base64_encode(md5(utf8_decode($inputString))) 

它应该像下面的PHP一样

  php -r "echo base64_encode(md5(utf8_encode('asd'),true));" 

我有同样的问题……只使用md5($ myvar)就可以了。 我得到了相同的结果C#和PHP。

Gavin Kendall发布了帮助我。 我希望这有助于其他人。

http://jachman.wordpress.com/2006/06/06/md5-hash-keys-with-c/

 public static string MD5Hash(string text) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(md5.ComputeHash(ASCIIEncoding.Default.GetBytes(text))), “-”, “”); }