将PHP的MD5和SHA1编码与C#相匹配

时间:2013-07-17 09:07:38

标签: c# php encoding md5 sha1

我有一个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的条件和问题相同。

1 个答案:

答案 0 :(得分:0)

PHP本身不适用于编码,任何字符串都是您的GetHashedString方法中的字节变量。鉴于此,编码取决于此变量的来源。如果它是utf-8编码文件,它将是utf-8,并且如果有的话还将包括BOM。