Diferença de hashes SHA entre ruby ??e C #
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?
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);