Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SHA-256: różnica między ruby a C#
Forum PHP.pl > Inne > Hydepark
nasty
Hello!

Wiem, że to może nie forum do tego, ale już wychodzę z siebię :S

Chodzi o to, że mam pewną dokumentację techniczną do pewnego serwisu, gdzie muszę użyć jego REST-owych usług. Dokumentacja jest napisana pod kątem ruby, a ja piszę aplikację w C# ale to nie problem - da się zrozumieć.

Problem jest w tym, że muszę wygenerować hash SHA-256 dla pewnego ciągu znaków i przekazać go w parametrze w formacie Base 64.

W dokumentacji jest napisane, że ciąg znaków:
Kod
hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a

po wykonaniu(ruby) :
Kod
digest = Digest::SHA256.digest(string_to_sign)
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')
zwraca nam:
Kod
YRYuN2zO+VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U


w mojej aplikacji mam identyczny ciąg znaków i po wykonaniu(C#):
Kod
byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
            string friendlyHash = Convert.ToBase64String(rawHash);
zwraca mi:
Kod
Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

i też wywalam końcowe "=" jak wymaga tego specyfikacja techniczna.

Próbowałem zmienić Encoding, w czasie zamieniania stringu na ciąg bajtów ale nic z tego.

Ogólnie jest 3:30 nad ranem i przestaję myśleć, może ktoś mądrzejszy rzuci na to okiem?

Dziękuję z góry!
dr_bonzo
W php dostaje wyniki jak dla C#

Cytat
<pre><?php
$str = 'hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a';

$hsh = hash("sha256", $str, false);
echo( "$hsh<br />");
echo( base64_encode($hsh) );

$res = "";
for ( $i = 0; $i < strlen($hsh); $i+= 2 )
{
$a = $hsh{$i};
$b = $hsh{$i+1};
$h= $a.$b;
$d = hexdec($h);
var_dump($h);
var_dump($d);

$chr = chr($d);
$res .= $chr;
}

echo( $res . "\n" );
echo( base64_encode($res) . "\n" );


sprawdz sobie http://en.wikipedia.org/wiki/Examples_of_S...#SHA-256_hashes (tlko ze tu dostajesz zapisz liczby w ASCII a nie bitowo/bajtowo)
nasty
Dobra, temat do usunięcia :-)
był problem w dokumentacji, oni sobie jakąś źle wyliczyli ten hash. Dupki! biggrin.gif
Już działa elegancko.
dr_bonzo
To co mieli zle?
nasty
mieli coś takiego:

Cytat
hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a
3. Generate an SHA-256 digest in base 64 format on this string, dropping any trailing '=' signs. This
example produces a signature of:

YRYuN2zO+VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U
dr_bonzo
No to wiem z pierwszego posta smile.gif

Ale jak zrobic zeby zrobic to jak oni maja? tzn "poprawnie"
nasty
Przekazując ten wyliczony przez mój program parameter do web service zadziałało i zmiana jego ręcznie w urlu wywalała błąd, że niepoprawny hesz. Czyli w sumie dobrze to obliczam a oni poprostu pomylili się wklejając to do dokumentacji.
dr_bonzo
Ok, widze ns SO.com o co chodzilo biggrin.gif
nasty
tez wchodzisz na so? biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.