我在c#中使用以下代码进行HMAC转换:
string RawData = "data";
string sharedKey = "my-key";
byte[] signature = Encoding.UTF8.GetBytes(RawData);
var KeyByteArray = Encoding.UTF8.GetBytes(sharedKey);
using (HMACSHA256 hmac = new HMACSHA256(KeyByteArray))
{
byte[] signatureBytes =hmac.ComputeHash(signature);
var ContentBase64String =(Convert.ToBase64String(signatureBytes));
Console.WriteLine(ContentBase64String );
Console.ReadKey();
}
Java中的以下内容:
String RawData="data";
String Key="my-key";
byte[] KeyByteArray=Key.getBytes("UTF-8");
byte[] signature=RawData.getBytes("UTF-8");
Mac sha256_HMAC;
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(KeyByteArray, "HmacSHA256");
sha256_HMAC.init(secret_key);
String ContentBase64String = Base64.encodeToString(sha256_HMAC.doFinal(signature),Base64.URL_SAFE|Base64.NO_WRAP);
C#的输出如下:
android的输出如下:
我已经使用了很多天,并且无法弄清楚我做错了什么因为输出不同虽然它们应该是相同的。另外,当我删除 - 在键中结果相同。我知道我可能会遗漏一些简单但却认为另一双眼睛可能会看到我的错误。谢谢。
答案 0 :(得分:0)
这些答案是相同的(就HMAC中包含的字节而言)。对于输出中+
和-
个字符的差异,您通过指定the Base64.URL_SAFE
flag明确告诉它执行该操作。
对于此问题的未来读者:如有疑问,请查阅文档,了解您不完全理解的所有内容。