2017-07-19 39 views
5

Będąc nowicjuszem w PHP, muszę przekonwertować tablicę bajtów na ciąg znaków, który może być użyty w funkcji php; hash_hmac("sha256", $payload, $key, true)Konwertuj tablicę bajtów na ciąg znaków w PHP

Numer $key będzie pochodził od Guid, na przykład {6fccde28-de32-4c0d-a642-7f0c601d1776}, który jest konwertowany na tablicę bajtów. Ponieważ hash_hmac pobiera ciąg znaków dla danych i klucza, muszę przekonwertować tę tablicę bajtów bez utraty z powodu niedrukowalnych znaków.

Używam następujący kod PHP:

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); 

Equivalent kod w C#:

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); 
} 

Podstawiając wartość w $key będzie produkować sam base64 wyjście w obu językach, pozostawiając $key być rzeczą to źle/różni się.

Tak; jak przekonwertować $keyBytes na $key bez utraty danych?

Odpowiedz

0

Spróbuj tej funkcji do konwertowania GUID na ciąg binarny:

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

Już to robię, jednak bez prawidłowej kolejności bajtów $ keyBytes będzie źle ... – SorenJorgensen

+0

;-) zobaczyłem go 2 minuty temu. Dzięki... – SorenJorgensen

1

Można użyć funkcji Chr w PHP

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

chr odbierają na wejściu int i zwraca corrispondent ascii char.

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

Mam nadzieję, że był pomocny

+0

ja już to zrobić, jednak nie będzie array_map „tylko” produkować inny szyk? Wynik, który musimy jeszcze złożyć w łańcuchu? – SorenJorgensen

+0

Możesz użyć funkcji impozycji, aby uzyskać ciąg znaków jako wynik. $ strings = array_map ("chr", $ bajtów); $ string = implode ("", $ stringi); –