我在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;
我怎样才能实现它?
我检查了
但是我注意到php md5最终没有得到== ...我错过了什么?
注意:我无法更改C#行为,因为它已经实现,并且使用此算法将密码保存在我的数据库中。
答案 0 :(得分:20)
问题是PHP的md5()
函数默认返回散列的十六进制变体,其中C#返回原始字节输出,然后必须使用base64编码使文本安全。如果您运行的是PHP5,则可以使用base64_encode(md5('asd', true))
。请注意,md5()
的第二个参数为true,这使得md5()
返回原始字节而不是十六进制。
答案 1 :(得分:5)
你还记得在php中使用base64编码md5哈希吗?
$result = base64_encode(md5($password, true));
第二个参数使md5返回原始输出,这与您在C#中使用的函数相同
答案 2 :(得分:4)
您的C#代码从字符串中获取UTF8字节;计算md5并存储为base64编码。所以你应该在php中做同样的事情,应该是:
$hashValue = base64_encode(md5(utf8_decode($inputString)))
答案 3 :(得分:1)
它应该像下面的php
php -r "echo base64_encode(md5(utf8_encode('asd'),true));"
答案 4 :(得分:0)
我有同样的问题......只使用md5($ myvar)就可以了。我得到的结果与C#和PHP相同。
答案 5 :(得分:-1)
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))), “-”, “”);
}