0

MD5 または SHA1 アルゴリズムを使用して、提供された文字列のハッシュを取得する C# コードがあります。それ自体は問題ありませんが、参考までに以下に示します。

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 }

さて、本当の問題は、PHP の md5() および sha1() と同じ結果を返すために、GetMD5 および GetSHA1 メソッドにどのエンコーディングを渡す必要があるかということです。PHP コードを変更することはできず、それにアクセスすることさえできません。ハッシュ署名を取得しているだけで、それが PHP で作成されたことを知っています。変更できるのは、必要に応じて C# コードです。

私はインターネットを見回しましたが、見つけた答えはさまざまです。彼らによると、SHA1 の場合は ASCII エンコーディングを使用する必要があり、MD5 の場合はわかりません (ただし、私自身のテストでは UTF8 を指しているようです)。

私は PHP についてほとんど何も知らないことを認めなければなりません。md5() と sha1() で使用されるエンコーディングは常に同じですか? または、文字列を事前に変換するある種のラッパーメソッドを使用するのではなく、md5() および sha1() 内で使用されるエンコーディングを変更することによって、何らかの方法でそれらを変更することは可能でしょうか? つまり、各メソッドに特定のエンコーディングを期待できますか、それとも異なる可能性がありますか?

編集

私の質問は一般的すぎるかもしれないので、可能性の数を少し減らしましょう。PHP ハッシュ コードは次のようになります。

$hash = sha1($str)

$str通常の文字列です。つまり、Base64 が適用されていない、追加のハッシュ アルゴリズムが使用されていないなどです。上記の PHP 行が生成するものと同じ出力を得るには、GetSHA1 メソッドにどのエンコーディングを渡す必要がありますか? 決定することさえ可能ですか?PHP の md5() と私の GetMD5 の条件と質問は同じです。

4

1 に答える 1

0

PHP 自体はエンコーディングでは機能しません。文字列は GetHashedString メソッドのバイト変数です。これを考えると、エンコーディングは、この変数のソースが何であるかによって異なります。utf-8 でエンコードされたファイルの場合は utf-8 になり、BOM があればそれも含まれます。

于 2013-07-17T09:24:29.870 に答える