2017-07-19 23 views
5

PHPに新しいので、バイト配列をphp関数で使用できる文字列に変換する必要があります。 hash_hmac("sha256", $payload, $key, true)バイト配列をPHPの文字列に変換する

$keyは、GUID(例:{6fccde28-de32-4c0d-a642-7f0c601d1776})から生成され、バイト配列に変換されます。 hash_hmacはデータとキーの両方の文字列をとるので、印刷不可能な文字のためにこのバイト配列を損失なく変換する必要があります。 C#で

function guidToBytes($guid) { 
    $guid_byte_order = [3,2,1,0,5,4,6,7,8,9,10,11,12,13,14,15]; 
    $guid = preg_replace("/[^a-zA-Z0-9]+/", "", $guid); 
    $result = []; 
    for($i=0;$i<16;$i++) 
     $result[] = hexdec(substr($guid, 2 * $guid_byte_order[$i], 2)); 
    return $result; 
} 

$payload = utf8_encode("Some data string"); 
$keyBytes = guidToBytes("6fccde28-de32-4c0d-a642-7f0c601d1776"); 
$key = implode(array_map("chr", $keyBytes)); 

$hash = hash_hmac("sha256", $payload, $key, true); 
$result = base64_encode($hash); 

等価コード:

私は、次のPHPコードを使用してい$keyに値を代入

var g = Guid.Parse("6fccde28-de32-4c0d-a642-7f0c601d1776"); 
var key = g.ToByteArray(); 
var data = "Some data string"; 
var payload = Encoding.UTF8.GetBytes(data); 

using(var ha = new HMACSHA256(key)) { 
    var hash = ha.ComputeHash(payload); 
    var result = Convert.ToBase64String(hash); 
} 

は、両方の言語で同じbase64出力を生成します、事あることを$keyを残しますそれは間違っている/違います。

So; $keyBytesをデータ損失なしで$keyに変換するにはどうすればよいですか?

答えて

0

役に立ったバイナリ文字列にGUIDを変換するには、この機能を試してみてください願っています:

function guidToBytes($guid) { 
    $guid_byte_order = [3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15]; 
    $guid = preg_replace("/[^a-zA-Z0-9]+/", "", $guid); 
    $result = []; 
    foreach ($guid_byte_order as $offset) { 
     $result[] = hexdec(substr($guid, 2 * $offset, 2)); 
    } 
    return $result; 
} 
+0

私はすでにこれを行っていますが、正しいバイトオーダーがなければ$ keyBytesは間違っています... – SorenJorgensen

+0

;-)それは2分前に見ました。ありがとう... – SorenJorgensen

1

あなたはint型の入力で受け取る

http://php.net/manual/en/function.chr.php

CHR PHP

にCHR関数を使用するとcorrispondentアスキー文字を返すことができます。

$strings = array_map("chr", $bytes); 
$string = implode(" ", $strings); 

私は

+0

私はすでにこれを行う、しかし、「ただ」他を生産array_mapをしませんアレイ? 結果は文字列にまとめる必要がありますか? – SorenJorgensen

+0

implode関数を使用すると、結果として文字列を取得できます。 $ strings = array_map( "chr"、$ bytes); $ string = implode( ""、$ strings); –

関連する問題