Разница между этими двумя результатами вызвана использованием кодировки Base64URL в коде C# против Base64 кодирования в node.js.
Base64URL
и Base64
почти идентичны, но в кодировке Base64
используются символы +
, /
и =
, которые имеют особое значение в URL-адресах и поэтому их следует избегать. В Base64URL
кодировка +
заменяется на -
, /
с _
и =
(символ заполнения на конце) либо заменяется на %20
, либо просто опускается.
В вашем коде вы вычисляете HMA C -SHA256 га sh, так что вы получите 256-битный результат, который может быть закодирован в 32 байта. В Base64
/ Base64URL
каждый символ представляет 6 бит, поэтому вам потребуется 256/6 = 42,66 => 43 символа Base64. С 43 символами у вас будет 2 «одиноких» бита на конце, поэтому добавляется символ заполнения (=
). Теперь возникает вопрос, почему HttpServerUtility.UrlTokenEncode
добавляет 1
в качестве замены для отступа в конце. Я не нашел ничего в документации . Но вы должны помнить, что в любом случае это незначительно.
Чтобы получить то же самое в node.js, вы можете использовать пакет base64url или просто использовать простые операторы replace
для в кодировке base64 ha sh.
С пакетом base64url:
const base64url = require('base64url');
var hmacB64 = "Pn55YBwEH2S2BEM5qlNrq+LMNE8BDdHYwbWKFEHiPZo="
var hmacB64url = base64url.fromBase64(hmacb64)
console.log(hmacB64url)
В результате:
Pn55YBwEH2S2BEM5qlNrq-LMNE8BDdHYwbWKFEHiPZo
, как видите, в этой библиотеке просто пропущена padding char.
С replace
, также заменяя padding =
на 1
:
var hmacB64 = "Pn55YBwEH2S2BEM5qlNrq+LMNE8BDdHYwbWKFEHiPZo="
console.log(hmacb64.replace(/\//g,'_').replace(/\+/g,'-').replace(/\=+$/m,'1'))
Результат:
Pn55YBwEH2S2BEM5qlNrq-LMNE8BDdHYwbWKFEHiPZo1
Я пытался код C# с различными данными и всегда имеет '1' в конце, поэтому заменить =
на 1
, кажется, все в порядке, хотя он не соответствует RF C.
Другой вариант, если это вариант для вас, это изменить код C#. Используйте обычную base64
кодировку и замену строки, чтобы получить base64url
вывод вместо использования HttpServerUtility.UrlTokenEncode
Возможное решение для этого описано здесь