PHP utf8 variable encoding (HMAC Key -> C# Server)

Viewed 938

I'm trying to create a PHP client wrapper to talk to a .NET API. What I have is working but I am new to PHP development and what I have now looks like it may not work 100% of the time.

C# code I am trying to replicate:

private static void HMAC_Debug()
{
    Console.WriteLine("Secret Key (Base64): 'qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs='");
    var secret = Convert.FromBase64String("qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs=");

    Console.WriteLine("Value To Hash (UTF8): 'MyHashingValue©'");
    var value = Encoding.UTF8.GetBytes("MyHashingValue©");

    using (HMACSHA256 hmac = new HMACSHA256(secret))
    {
        byte[] signatureBytes = hmac.ComputeHash(value);
        string requestSignatureBase64String = Convert.ToBase64String(signatureBytes);

        Console.WriteLine("Resulting Hash (Base64): '{0}'", requestSignatureBase64String);
    }

    Console.ReadLine();
}

My PHP Equiv:

    $rawKey = base64_decode("qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs=");

//        $hashValArr =  unpack("C*", utf8_encode("MyHashingValue©"));        
//        
//        $hashVal = call_user_func_array("pack", array_merge(array("C*"), $hashValArr));

    $hashVal = "MyHashingValue©";

    $raw = hash_hmac("sha256", $hashVal, $rawKey, TRUE);
    $rawEnc = base64_encode($raw);

    echo $rawEnc;

These two snippets produce the same Base64 output, but I am relying on the string variables in PHP being default encoded to UTF8 - is this a correct assumption or is there something more stable I can do?

You can see from the commented out PHP lines I attempted to manually encode it to UTF8 then extract out the ASCII bytes for the PHP HMAC function but it didn't produce the same output as the c# code.

Thanks

Marlon

1 Answers
Related