Pergunta

Estou desenvolvendo uma aplicação, que faz uso de alguns serviços Web REST. É documentação técnica diz que eu deveria passar SHA256 hash alguma corda no pedido.

Em um pedido de exemplo (na documentação) uma string:

HN-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires = 1893013926label [0] = qualquer / somestatistics = 1D, 2D, 7d, 28d, 30d, 31d, lifetimestatus = UPL, livetitle = a

Depois de executar:

digest = Digest::SHA256.digest(string_to_sign)
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')

resulta em um hash:

YRYuN2zO + VvxISNp / vKQM5Cl6Dpzoin7mNES0IZJ06U

Este exemplo é em Ruby, como a documentação é para desenvolvedores Ruby.

Estou desenvolvendo minha aplicação em C # e para a exatamente mesma corda, quando eu executar:

byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
string friendlyHash = Convert.ToBase64String(rawHash);

e remova a fuga "=" sinais, eu recebo:

Vw8pl / KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

e, portanto, o aplicativo falhar para executar resultando em um erro de assinatura incompatibilidade.

Eu tentei alterar a codificação ao converter a string para um array de bytes que precede o hashing e nada mudou.

Todas as idéias?

Foi útil?

Solução

Com base no documento aqui , você está faltando um - (que é um traço) na cadeia. Parece que Acrobat prestativamente remove-lo em uma pasta de cópia do documento ...

Aqui está um código que eu splatted juntos que recebe o mesmo valor que o exemplo (bem que seria se você aparou as = finais)

    string s = "hn-Rw2ZH-YwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a";

    SHA256Managed sh = new SHA256Managed();
    byte[] request = System.Text.UTF8Encoding.UTF8.GetBytes(s);
    sh.Initialize();
    byte[] b4bbuff = sh.ComputeHash(request, 0, request.Length);

    string b64 = Convert.ToBase64String(b4bbuff);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top