2017-07-19 47 views
5

Làm quen với PHP Tôi cần phải chuyển đổi một mảng byte thành chuỗi có thể được sử dụng trong hàm php; hash_hmac("sha256", $payload, $key, true)Chuyển đổi mảng byte thành chuỗi trong PHP

$key sẽ bắt nguồn từ Hướng dẫn, nói {6fccde28-de32-4c0d-a642-7f0c601d1776}, được chuyển đổi thành một mảng byte. Khi hash_hmac lấy một chuỗi cho cả dữ liệu và khóa tôi cần để chuyển đổi mảng byte này mà không bị mất do các ký tự không thể in được.

Tôi đang sử dụng mã PHP sau:

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

mã tương đương trong 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); 
} 

Thay giá trị trong $key sẽ sản xuất cùng base64 đầu ra trong cả hai ngôn ngữ, để lại $key là điều đó là sai/khác.

Vì vậy; làm cách nào để chuyển đổi $keyBytes thành $key mà không làm mất dữ liệu?

Trả lời

0

Vui lòng thử chức năng này để chuyển đổi một GUID thành một chuỗi nhị phân:

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

Tôi đã làm điều này, tuy nhiên không có thứ tự byte chính xác $ keyBytes sẽ bị sai ... – SorenJorgensen

+0

;-) đã xem nó cách đây 2 phút. Cảm ơn... – SorenJorgensen

1

Bạn có thể sử dụng chức năng chr trong PHP

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

chr nhận ở đầu vào một int và trả về một ascii char corrispondent.

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

Tôi hy vọng tôi là hữu ích

+0

Tôi đã làm điều này, tuy nhiên sẽ không array_map "chỉ là" sản xuất khác mảng? Kết quả sau đó vẫn phải đặt cùng nhau trong một chuỗi? – SorenJorgensen

+0

Bạn có thể sử dụng hàm implode để có được chuỗi là kết quả. $ strings = array_map ("chr", $ bytes); $ string = implode ("", $ strings); –

Các vấn đề liên quan