2017-07-14 12 views
0

PHPでヘッダーの承認が必要なAPIにアクセスしようとしています。この承認では、SHA256ハッシュの一部にキーを使用します。 APIの作成者は、このハッシュを作成するためにC#で書かれた.exeを私に提供しました。しかし、今は.exeを使用することは現実的ではなく、PHPでやりたいと思います。PHPでC#SHA256ハッシュをレプリケートする

ハッシュを作成する正しいC#コードは次のとおりです。

var url = "[url]"; 

var userId = "apiuser"; 

var timestamp = "Fri, 14 Jul 2017 00:28:07 GMT"; // DateTime.UtcNow; 

var keyString = "dGVzdA=="; 

var hashData = String.Format("GET\n{0}\n{1}\n{2}\n", url, userId, timestamp); //.ToString("r")); 

var key = Convert.FromBase64String(keyString); 
string hashString; 

using (var hmac = new HMACSHA256(key)) 
{ 
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(hashData)); 
    hashString = Convert.ToBase64String(hash); 
} 
Console.WriteLine(hashString); 

C#のハッシュ:私が試みた6cI0NV6AKYILTyYHs + hyA0 + Q4iRfMw + H2FGsp7uKOFM =

:CfS6zNR3pTP0kJIA0RJ7LUwQXjONroVIg65bDvuefH8は=ここ

はPHP

でそれを複製する私の試み
$key = "dGVzdA=="; 
$user = "apiuser"; 
$url = "[url]"; 

$timestamp = "Fri, 14 Jul 2017 00:28:07 GMT"; // date("D, d M Y H:i:s e"); 

$hashdata = 'GET\n' . $url . '\n' . $user . '\n' . $timestamp; 

$generatedhash = base64_encode(hash_hmac('sha256', $hashdata, base64_decode($key), true)); 

print_r($generatedhash); 

PHPハッシュですPHPの生成されたハッシュに対するさまざまなアプローチが多く、同じものはありませんでした。また、PHPの日付がC#の日付と同じかどうかはわかりませんが、それは待つことができます。どんな助けもありがとうございます。

+1

すべての\ nを二重引用符で囲んでください。 –

答えて

1

この

$hashdata = 'GET\n' . $url . '\n' . $user . '\n' . $timestamp; 

するために、この

var hashData = String.Format("GET\n{0}\n{1}\n{2}\n", url, userId, timestamp); 

あなたが終わる '\ n' のとPHPアウト@フレッド-II-ポイントのみ扱いますよう\ nと文字が欠落している比較" '' ではない:

$hashdata = "GET\n" . $url . "\n" . $user . "\n" . $timestamp . "\n" ; 

それとも、このPHPは内部の変数を評価しますので、 "" 内のエスケープ":

PHPで
$hashdata = "GET\n$url\n$user\n$timestamp\n" ; 

対シングル二重引用符:書かれたように、単一引用符 'ハロー$人の\ r \ n' で

  • 文字列が正確に取られています。 \ r \ nの代わりに改行改行を使用すると、 '¥' '¥' '¥n'の4文字で$ が "$ person"というと表示されます。
  • 二重引用符で囲まれた文字列 "hello $ person \ r \ n"は2通りの方法で処理されます。1.任意の$ nameは変数として扱われ、その変数の値に置き換えられます(変数が存在しない場合は空の文字列) 。 2. \ r \ nのような文字エスケープと\は他の言語と同様に動作します。
+0

をお試しください。返信いただきありがとうございます。私は "\ n"を見逃すことはできません。私はそれを追加しましたが、私は再びテストしたときにそれはまだ異なります。 hash_hmac()の "true"パラメータは、utf8をエンコードするのと同じにする必要がありますか?とにかくutf8_encode($ hashdata)でテストしましたが、結果は変わりませんでした。 – Verpos

+1

\ n二重引用符で囲む必要があります。私はPHPを信じています –

+0

良いキャッチ@Fred-ii- –

関連する問題