匹配PHP';s使用C#进行MD5和SHA1编码

本文关键字:MD5 进行 SHA1 编码 使用 PHP 匹配 | 更新日期: 2023-09-27 18:22:40

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

匹配PHP';s使用C#进行MD5和SHA1编码

PHP本身不支持编码,任何字符串都是GetHashedString方法中的字节变量。考虑到这一点,编码取决于这个变量的来源。如果是utf-8编码的文件,它将是utf-8,如果有BOM,也将包括BOM。