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 の条件と質問は同じです。