У меня есть существующая функция PHP, которая вручную подписывает http-запрос AWS S3, созданный на основе JavaScript, используя протокол подписи версии 2, который теперь мне нужно реплицировать в .net-core v2.0.
Функция php использует встроенные функции
base64_encode(hash_hmac('sha1',$message,$key,true));
подписать message
используя key
, true
param передает необработанный двоичный хэшированный вывод в кодировщик base64
Я пытался воспроизвести hash_hmac()
функция в .net-core
private static byte[] hash_hmac(string message, string key)
{
UTF8Encoding encoding = new UTF8Encoding();
Byte[] messageBytes = encoding.GetBytes(message);
Byte[] keyBytes = encoding.GetBytes(key);
Byte[] hashBytes;
using (HMACSHA1 hash = new HMACSHA1(keyBytes))
hashBytes = hash.ComputeHash(messageBytes);
return hashBytes;
}
и выходные данные хеш-функций SHA1 (сравнивая десятичное значение каждого байта в массиве), когда передаются идентичные сообщение и ключ, различаются.
Куда я иду не так?
Я не нашел никаких примеров .net-core для подписания запросов S3 и не нашел утилиты в AWS S3 SDK, которую я мог бы использовать (в виде библиотеки или фрагмента кода). Я знаю, что рекомендуется версия 4, а SHA1 — нет.
РЕДАКТИРОВАТЬ: Добавлен пример:
key: "fC+MbKash6koR/DjrB4bP9Sjc2L38ADqxsor8KW+"message: "This is my message to sign"
Ord () каждого байта в php hash_hmac имеет вид
183 250 242 111 104 14 103 87 237 80 69 21 99 221 240 130 137 84 57 103 0
Когда я использую мои .net-core hash_hmac () и ToString () для каждого байта, я получаю
183 250 242 111 104 14 103 87 237 80 69 21 99 221 240 130 137 84 57 103
Идентичный, за исключением дополнительного 0
байт в версии php.
Что вызвало бы это?
Задача ещё не решена.
Других решений пока нет …