Estou vendo um exemplo no dotnet que se parece com o seguinte: https://dotnetfiddle.net/t0y8yD.
A saída do HttpServerUtility.UrlTokenEncodemétodo é:
Pn55YBwEH2S2BEM5qlNrq-LMNE8BDdHYwbWKFEHiPZo1
Quando tento completar o mesmo em NodeJS com encodeURI, encodeURIComponentou qualquer outra tentativa, obtenho o seguinte:
Pn55YBwEH2S2BEM5qlNrq+LMNE8BDdHYwbWKFEHiPZo=
Como você pode ver acima, o '-' deve ser um '+' e a última parte do caractere é diferente. O hash é criado da mesma forma e gera o mesmo buffer.
var hmac = crypto.createHmac("sha256", buf);
hmac.update("9644873");
var hash = hmac.digest("base64");
Como posso combinar os dois? Outra observação importante é que este é um caso de uso e não tenho certeza se há outros chars que fazem o mesmo.
Não tenho certeza se a variante dotnet está incorreta ou a versão NodeJS está. No entanto, a comparação será feita no lado dotnet, portanto, preciso que o nó corresponda a isso.
A diferença entre os dois resultados é causada pelo uso da codificação Base64URL no código C # em comparação com a codificação Base64 no node.js.
Base64URLe Base64são quase idênticas, mas Base64a codificação usa os caracteres +, /e =, que têm um significado especial em URLs e, portanto, tem que ser evitado. Na Base64URLcodificação, +é substituído por -, /por _e =(o caractere de preenchimento no final) é substituído por %20ou simplesmente omitido.
Em seu código, você está calculando um hash HMAC-SHA256, então obtém um resultado de 256 bits, que pode ser codificado em 32 bytes. Em Base64/ Base64URLcada caractere representa 6 bits, portanto, você precisaria de 256/6 = 42,66 => 43 caracteres Base64. Com 43 caracteres, você teria 2 bits 'solitários' no final, portanto, um caractere de preenchimento ( =) é adicionado. A questão agora é por que HttpServerUtility.UrlTokenEncodeadiciona um 1como um substituto para o caractere de preenchimento no final. Não encontrei nada na documentação . Mas você deve ter em mente que é insignificante de qualquer maneira.
Para obter o mesmo em node.js, você pode usar o pacote base64url ou apenas usar replaceinstruções simples no hash codificado em base64.
Com o pacote base64url:
const base64url = require('base64url');
var hmacB64 = "Pn55YBwEH2S2BEM5qlNrq+LMNE8BDdHYwbWKFEHiPZo="
var hmacB64url = base64url.fromBase64(hmacb64)
console.log(hmacB64url)
O resultado é:
Pn55YBwEH2S2BEM5qlNrq-LMNE8BDdHYwbWKFEHiPZo
como você pode ver, esta biblioteca apenas omite o caractere de preenchimento.
Com replace, também substituindo o enchimento =por 1:
var hmacB64 = "Pn55YBwEH2S2BEM5qlNrq+LMNE8BDdHYwbWKFEHiPZo="
console.log(hmacb64.replace(/\//g,'_').replace(/\+/g,'-').replace(/\=+$/m,'1'))
O resultado é:
Pn55YBwEH2S2BEM5qlNrq-LMNE8BDdHYwbWKFEHiPZo1
Tentei o código C # com dados diferentes e sempre obtive '1' no final, portanto, substituir =por 1parece estar ok, embora não pareça estar de acordo com a RFC.
A outra alternativa, se esta for uma opção para você, é alterar o código C #. Use a base64codificação normal mais a substituição da string para obter a base64urlsaída em vez de usarHttpServerUtility.UrlTokenEncode
Uma possível solução para isso é descrita aqui
Sou novo aqui, então não posso comentar (preciso de 50 reputação), mas gostaria de acrescentar à resposta @jqs que se a string terminar com dois "=", a substituição precisa ser feita com "2". Então, minha substituição se parece com:
hmacb64.replace (/// g, '_'). replace (/ + / g, '-'). replace (/ \ = \ =$/m,'2').replace(/\=$/ m, '1')
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.