2017-07-04 5 views
0

Ich habe mir zahlreiche Fragen angesehen, kann aber den Fehler, den ich mache, nicht sehen. Ich versuche, eine Shared Access-Signatur für den Zugriff auf eine Azure SB-Warteschlange zu erstellen.Konvertierung von HMAC Hash von C# zu PHP

code Mein C# arbeiten korrekt ist:

var expiry = 1499177142;// GetExpiry(); 
    string stringToSign = HttpUtility.UrlEncode(resourceUri);// + "\n" + expiry; 
    HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)); 

    Console.WriteLine(Encoding.UTF8.GetBytes(stringToSign)); 

    var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign))); 
    Console.WriteLine(signature); 

    var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", 
    HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName); 
    return sasToken; 
// returns slXBw0u7Dt/YKS1Y+Wot02z730YXJ9NkS599JRzvDQI= for the signature element 

Meine PHP gibt ein ganz anderes Ergebnis:

$stringToSign = rawurlencode($resourceURI);// . "%0A" . $expiry; 

$sig = hash_hmac("sha256",utf8_encode($stringToSign),utf8_encode($key),false); 
echo $sig."<br>"; 

$token = "SharedAccessSignature sr=".urlencode($resourceURI) 
."&sig=".rawurlencode(base64_encode($sig))."&se=".$expiry."&skn=".$keyName; 
return $token; //returns MGNlZWViYWRmMjE2NWJhZGRjNWNhNDZkYWRlOTQyMzc3ODBhMWM2ZjA1OTk4MjI0MGUzMzllZmY4ZTk2OGUxNA== 

Ich habe versucht Codierung $stringToSign und $key und nicht in der Hash, strtoupper und strtolower auf der $stringToSign aber kann nicht das Ergebnis erhalten, um das gleiche zu sein wie C#

+0

Überprüfen Sie den Zeichensatz/Codierung der PHP-Eingangsdaten. https://stackoverflow.com/questions/12804231/c-sharp-equivalent-to-hash-hmac-in-php – DanielO

+0

Ich füge es als eine Zeichenfolge im Moment '$ resourceURI =" https: // abc. servicebus.windows.net/myqueue ";', gleiches mit $ key –

Antwort

1

Thi s-Code sollte in PHP und C# funktionieren.

PHP:

<?php 

$resourceURI = "http://nifi-eventhub.servicebus.windows.net/hub1"; 
$keyName = "hub-user"; 
$key = "secret"; 
$expiry = '1499177142'; // timestamp 

// The format for the string is <resourceURI> + \n + <expiry>  
$stringToSign = strtolower(rawurlencode($resourceURI)) . "\n" . $expiry; 

// Hash the URL encoded string using the shared access key 
$sig = hash_hmac("sha256", utf8_encode($stringToSign), utf8_encode($key), false); 

// Convert hexadecimal string to binary and then to base64 
$sig = hex2bin($sig); 
$sig = base64_encode($sig); 

// 7kS3apSDpJFTYI1vxuo4t7syGG3FTBYI8foamMOtrEE= 
echo $sig . "<br>\n"; 

// Generate authorization token 
$token = "SharedAccessSignature sr=" . urlencode($resourceURI) . "&sig=" . rawurlencode($sig) . "&se=" . $expiry . "&skn=" . $keyName; 
echo $token . "<br>\n"; 

In C#

string expiry = "1499177142"; 
string resourceUri = "http://nifi-eventhub.servicebus.windows.net/hub1"; 
string keyName = "hub-user"; 
string secretkey = "secret"; 

string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry; 

HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretkey)); 
byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); 

var signature = Convert.ToBase64String(hashBytes); 

// 7kS3apSDpJFTYI1vxuo4t7syGG3FTBYI8foamMOtrEE= 
Console.WriteLine(signature); 

var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", 
HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName); 

Console.WriteLine(sasToken);