将HMAC Hash从C#转换为PHP

时间:2017-07-04 14:36:18

标签: c# php hmac

我已经看过很多关于此的问题,但却看不到我犯的错误。我正在尝试生成共享访问签名以访问Azure SB队列。

我的C#代码工作正常:

    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

我的PHP给出了一个非常不同的结果:

$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==

我已尝试对$stringToSign$key进行编码,而不是strtoupper上的哈希,strtolower$stringToSign,但可以&#39;得到的结果与C#

相同

1 个答案:

答案 0 :(得分:1)

此代码应该在PHP和C#中工作。

PHP:

<form role="form" id="sendAddress" th:action=@{/sendAddress} method="post">
    <select class="form-control" name="*nameOfCity*">
        <option value="">Select City</option>
        <option value="HYD">Hyderabad</option>
        <option value="MUM">Mumbai</option>
        <option value="DEL">Delhi</option>
    </select>
</form>

在C#中

@RequestMapping(value={"/sendAddress"}, method = RequestMethod.POST)
public String messageCenterHome(**@RequestParam** String *nameOfCity*) {
    // value of nameOfCity is now value of "nameOfCity" paramter,
    // that is, the value of the option tag selected
    // return view 
}