2012-11-08 11 views
5

Chcę zamienić następujący kod C# w PHP.Jaki jest odpowiednik kodu PHP w tym kodowaniu C#?

C# jest:

byte[] operation = UTF8Encoding.UTF8.GetBytes("getfaqs"); 
byte[] secret = UTF8Encoding.UTF8.GetBytes("Password"); 

var hmac = newHMACSHA256(secret); 
byte[] hash = hmac.ComputeHash(operation); 

Jakie mam zamienił się w ten sposób:

$hash = hash_hmac("sha256", utf8_encode("getfaqs"), utf8_encode("Password")); 

Wtedy mam:

var apiKey = "ABC-DEF1234"; 
var authInfo = apiKey + ":" + hash 

//base64 encode the authorisation info 
var authorisationHeader = Convert.ToBase64String(Encoding.UTF8.GetBytes(authInfo)); 

co moim zdaniem powinno być:

$authInfo = base64_encode($apiKey . ":" . $hash); 

Albo

$authInfo = base64_encode(utf8_encode($apiKey . ":" . $hash)); 

Ale nie jest pewne, zauważyć to drugie kodowanie wykorzystuje Encoding.UTF8 nie UTF8Encoding.UTF8.

Jak powinien wyglądać kod PHP?

+2

'UTF8Encoding.UTF8' i' Encoding.UTF8 'są równoważne. 'UTF8Encoding' dziedziczy po' Encoding', dzięki czemu zyskuje właściwość 'UTF8'. –

Odpowiedz

3

Struny PHP są już (rodzaj) byte[], php nie ma żadnej świadomości kodowania. utf8_encode faktycznie zamienia ISO-8859-1 na UTF-8, więc nie jest tutaj potrzebny.

Jeśli te ciągi są literałami w pliku, plik ten musi zostać zapisany w kodowaniu UTF-8.

Przełęcz true do hash_hmac jako parametr 4 i usunąć tych utf8_encode połączeń:

$hash = hash_hmac("sha256", "getfaqs", "Password", true); 

Ponadto, operator konkatenacji jest ., więc:

$authInfo = base64_encode($apiKey . ":" . $hash); 
+0

dzięki za złapanie literówki - poprawione. Nadal nie uwierzytelniałem, ale myślę, że twój kod jest w porządku i mamy dodatkowe problemy. – jmadsen

+0

@jmadsen tak, "C#" nie jest kompletne. Przed tą linią: 'var apiKey =" ABC-DEF1234 "; var authInfo = apiKey + ":" + hash', 'hash' to wciąż' bajt [] ', więc jak można go połączyć z łańcuchem? – Esailija

Powiązane problemy