1

私はPHPのコードを持っていますが、以下のPHPコードを実行すると、以下のようになります。PHPコードの下にあるC#コードを実行すると、異なる結果が得られます。どこが間違っているのかわかりません。

$accessID = "member-1681fca809";
$secretKey = "63f22236ab43b69462b3272b110e3c78";

$expires = 1357039353;
$stringToSign = $accessID."\n".$expires;

$binarySignature = hash_hmac('sha1', $stringToSign, $secretKey, true);
$urlSafeSignature = urlencode(base64_encode($binarySignature));
print_r($expires);
print_r($urlSafeSignature);

I got Output
1357039353
M1PZW2DYVzdRV1l4ZHBPAmiv9iM%3D

C#で同じコードを実行しているときに、異なる出力が得られました

string accessid = "member-1681fca809";
string secretekey = "63f22236ab43b69462b3272b110e3c78";
int Expire = 1357039353;

string stringTosign = accessid + Environment.NewLine + Expire;
byte[] secret = UTF8Encoding.UTF8.GetBytes(secretekey);

HMACSHA1 myhmacsha1 = new HMACSHA1(secret);
byte[] byteArray = Encoding.ASCII.GetBytes(stringTosign);
MemoryStream stream = new MemoryStream(byteArray);
byte[] hashValue = myhmacsha1.ComputeHash(stream);
string k = Convert.ToBase64String(Encoding.ASCII.GetBytes(hashValue.ToString()));

console.WriteLine(Expire);
console.WriteLine(k);

I Got OutPut
1357039353
U3lzdGVtLkJ5dGVbXQ==
4

3 に答える 3

2

コードを少し変更しました。

string accessid = "member-1681fca809";
string secretekey = "63f22236ab43b69462b3272b110e3c78";
int Expire = 1357039353;

string stringTosign = accessid + "\n" + Expire;
byte[] secret = UTF8Encoding.UTF8.GetBytes(secretekey);

HMACSHA1 myhmacsha1 = new HMACSHA1(secret);
byte[] byteArray = Encoding.ASCII.GetBytes(stringTosign);
MemoryStream stream = new MemoryStream(byteArray);
byte[] hashValue = myhmacsha1.ComputeHash(stream);
string k = Convert.ToBase64String(hashValue);

Console.WriteLine(Expire);
Console.WriteLine(k);

「=」文字を変換するurl_encodeを使用しているため、唯一の違いは最後の文字になります。

于 2013-01-01T12:16:50.317 に答える
0

ありがとう!問題は解決しましたが、それでも私の経験を共有したいと思いました。

私が行っていた間違いは、sbr.AppendLine()の代わりに文字列ビルダーsbr.Appendを使用したか、\nが改行として読み取られる場合のように直接文字列連結を使用したことです。

于 2014-05-08T09:33:59.917 に答える
0

HMACSHA1 / hash_hmac('sha1'、...)で異なる結果が得られたら、input = "a"、key = "b"のような非常に単純な入力を使用してPHPバージョンとC#バージョンの分割テストを開始します。キーをHMACSHA1に渡す前にエンコードしている場合は、正しくエンコードしていることを確認してください。問題はHMACSHA1ハッシュであると考えて何時間も費やしましたが、実際にはpack('H *'...)の実装が不適切でした。

public static string Encode(string input, byte[] key)
{
    HMACSHA1 myhmacsha1 = new HMACSHA1(key);
    byte[] byteArray = Encoding.ASCII.GetBytes(input);
    MemoryStream stream = new MemoryStream(byteArray);
    return myhmacsha1.ComputeHash(stream).Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
}

およびpack('H *'...)C#の実装:

public static byte[] PackH(string hex)
{
    if ((hex.Length % 2) == 1) hex += '0';
    byte[] bytes = new byte[hex.Length / 2];
    for (int i = 0; i < hex.Length; i += 2)
    {
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    }
    return bytes;
}

Encode関数にデータを渡すときは、バイト配列から文字列に変換したり、バイト配列に戻したりしないでください。byte[]を渡すだけで、物事をシンプルに保つことができます。

于 2015-09-15T21:42:47.293 に答える