我有一个C#代码,它使用MD5或SHA1算法获取提供的字符串的哈希值。这本身并不是问题,但这里有一个参考:
public static string GetMD5(Encoding encoding, params string[] components)
{
return GetHashedString(HashingMethod.MD5, encoding, components);
}
public static string GetSHA1(Encoding encoding, params string[] components)
{
return GetHashedString(HashingMethod.SHA1, encoding, components);
}
private static string GetHashedString(HashingMethod method, Encoding encoding, params string[] components)
{
HashAlgorithm algorithm = null;
switch (method)
{
case HashingMethod.MD5:
algorithm = new MD5CryptoServiceProvider();
break;
case HashingMethod.SHA1:
algorithm = new SHA1CryptoServiceProvider();
break;
}
StringBuilder data = new StringBuilder();
foreach (string param in components)
data.Append(param);
byte[] bytes = encoding.GetBytes(data.ToString());
bytes = algorithm.ComputeHash(bytes);
StringBuilder result = new StringBuilder();
foreach (byte b in bytes)
result.AppendFormat("{0:x2}", b);
return result.ToString();
}
private enum HashingMethod { MD5, SHA1 }
现在,真正的问题是我应该将哪种编码传递给GetMD5和GetSHA1方法,以便它们返回与PHP的md5()和sha1()相同的结果?我不能改变PHP代码,我甚至没有访问它,我只是得到一个哈希签名,我知道它是用PHP创建的。如果有必要,我可以改变的是我的C#代码。
我环顾了互联网,我发现的答案各不相同。根据它们对SHA1我应该使用ASCII编码而对于MD5我不知道(我自己的测试似乎指向UTF8)。
我必须承认我对PHP几乎一无所知。 md5()和sha1()中使用的编码是否始终相同(如果是,哪些编码)?或者也许有可能以某种方式改变它们 - 不是通过使用某种类型的包装方法事先转换字符串,而是通过改变md5()和sha1()中使用的编码?换句话说,我可以期待每种方法的特定编码,还是可以改变?
修改
由于我的问题可能过于笼统,让我们减少一些可能性,让我们说PHP哈希码看起来像这样:
$hash = sha1($str)
其中$str
是普通字符串,即没有应用Base64,没有使用其他哈希算法等。我必须传递给我的GetSHA1方法以获得与上述PHP行相同的输出的编码?甚至可以确定吗? PHP的md5()和我的GetMD5的条件和问题相同。
答案 0 :(得分:0)
PHP本身不适用于编码,任何字符串都是您的GetHashedString方法中的字节变量。鉴于此,编码取决于此变量的来源。如果它是utf-8编码文件,它将是utf-8,并且如果有的话还将包括BOM。