Я использую следующий код в C# для преобразования HMAC:C# Android 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 отображается как «+» в C#. Посмотрите в конец. Я упомянул об этом во второй последней строке вопроса –
Кроме того, если a/присутствует в одном, то оно отображается как _ в другом. Остальные совпадения –