我正在尝试将一些C#ASP.NET webservice集成到我的PHP应用程序中,但是存在一个大问题。 C#webservice进行加密的方式与PHP进行MD5加密的方式不兼容。我找到了将C#MD5转换为PHP MD5的解决方案,但我无法更改C#代码。有没有办法改变PHP进行MD5加密以匹配C#的方式? c#加密的工作方式如下:
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(stringToEncrypt);
String myString = Convert.ToBase64String(MD5.ComputeHash(bs));
答案 0 :(得分:3)
由于MD5是已发布的算法,因此PHP和c#中的实现是相同的。唯一的区别是它们产生的字节序列的字符串格式。 PHP生成一个十六进制字符串,因此您只需要将十六进制转换为Base64。
答案 1 :(得分:0)
这可能是编码问题。确保你的PHP版本获得字符串的UTF-8表示,应用MD5,然后转换为基本的64字符串,你应该没问题。
答案 2 :(得分:0)
这是我之前在PHP和C#之间遇到的编码问题。
如果PHP正在操作ISO-8859-1字符串(可能是你的情况),你可以这样做:
md5(utf8_encode($stringToEncrypt))
测试的最佳方法是尝试使用a-z内容的非常简单的字符串,无论编码问题如何,都应该可以正常工作。它有效,而整个事情没有,你有一个编码问题。
你也可以这样做:
byte[] bs = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(stringToEncrypt);
和
md5($stringToEncrypt)
工作得很好。
答案 3 :(得分:0)
我知道你的问题是什么:
String myString = Convert.ToBase64String(MD5.ComputeHash(bs));
将使用纯MD5数组哈希创建Base64字符串。
PHP将首先制作MD5哈希的十六进制表示,然后对其进行base64编码。
您应该首先获得十六进制结果,如下所述:
http://blog.stevex.net/c-code-snippet-creating-an-md5-hash-string/
然后base64编码字符串。