@zdzisiek-bula: python daje mi taki sam wynik jak pehap. Coś z javą musi być nie tak. Nie znam javy, więc nie wiem co :) Ale zgaduję, że printowanie tej tablicy bajtów jakoś dziwnie się zachowuje. Może twój terminal coś psuje?
Sesja z pythona:
In [1]: s = '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234' In [2]: from hashlib import sha256 In [3]: sha256(s).digest() Out[3]: ' echo hash('sha256', '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234'); 3c4cc9cdefab849c01169d6311e225c59a4e9f1800989b549b104958358a0f5d php > echo hash('sha256', '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234', true); `
@zdzisiek-bula: System.out.println(authKey); Zwraca domyślnie toString obiektu - które z tego co kojarzę zawiera typ i hashcode, musisz zrobić System.out.println(Arrays.toString(authKey)); Zmień IDE na jakieś normalne, np Intellija to nie będziesz robił takich błędów ;) Intellijka sama proponuje poprawę takiego kodu.
@GotoFinal: Ja generalnie koduje w PHP'ie, kod z Javy spreparowałem tylko dla zobrazowania problemu, więc IDE raczej zmieniał nie będę ;) Ale dzięki za radę, przyjrzę się jak to wygląda z taką opcją, jak Twoja.
Albo coś źle robisz (źle korzystasz z api wystawionego przez zewnętrznego dostawce), albo ten dostawca #!$%@?ł :P Jeżeli ten kod ma zwrócić hasha jako Stringa to musi on być przekonwertowany z tablicy bajtów na Stringa. Zwracanie toStringa IMO jest bezcelowe
@rysi3k_: @MicNeo: @GotoFinal: @m_bielawski: Sprawdziłem dokładnie jeszcze kod w Javie. Zwracany jest do mnie nie toString obiektu, ale coś takiego:
return Base64.encodeToString(bytesOfToken, Base64.NO_WRAP); Czy to jakoś rozwiązuje problem? Chyba niewiele to zmienia, bo do base64 leci nadal toString obiektu? Mam rację?
@zdzisiek-bula: To co podałeś wcześniej [B@15db9742 to nie jest base64. Jeżeli zwracane jest to co piszesz, to czym w tym przypadku jest bytesOfToken ?
@rysi3k_: To, co podałem wcześniej, to mój spreparowany kawałek kodu w Javie na podstawie źródeł, które dostałem i oczywiście nie jest to base64.
W oryginale wygenerowany jest hash w podanym wcześniej sposób i zwracane jest z tego base64. Czy to w ogóle ma sens? Podejrzewam, że i tak do base64 leci efekt metody toString na obiekcie? Mam rację?
@zdzisiek-bula: teoretycznie Base64.encodeToString przyjmuje tablice bajtów jako parameter więc toString raczej nie jest wywowyłwany (nie znam javy na tyle by być pewnym).
W takim wypadku przyjmuje on tablicę bajtów, więc nie ma mowy o żadnym toStringu. To nie jest tak, że zawsze możesz wrzucić obiekt do wywowałania metody i jeżeli typ nie pasuje to zostanie wywołane toString. Java jest mocno
W przykładzie przedstawiłem nieco uproszczoną wersję kodu po obydwu stronach, dlatego może nie było wszystko do końca jasne. Ostatecznie sprawę rozwiązało dodanie w odpowiednich miejscach w PHP trzeciego parametru "true" dla metody hash.
Dzięki wszystkim za pomoc, można się rozejść :) Pozdro :)
Mam taki kod w javie:
String deviceId = "67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd42834";
String pin = "1234";
MessageDigest messageDigest;
try {
messageDigest = MessageDigest.getInstance("SHA-256");
String key = deviceId + pin;
messageDigest.update(key.getBytes());
byte[] authKey = messageDigest.digest();
System.out.println(authKey);
} catch (NoSuchAlgorithmException ex) {
System.out.println("blad 1");
}
Jego wykonanie zwraca mi: [B@15db9742
Teraz kod w PHPie:
$deviceId = "67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd42834";
$pin = "1234";
$key = $deviceId . $pin;
$authKey = hash('sha256', $key);
print $authKey;
Jego wykonanie zwraca mi: 3c4cc9cdefab849c01169d6311e225c59a4e9f1800989b549b104958358a0f5d
Na moje oko obydwa kawałki kodu robią to samo. Skąd różnica w wyniku?
String.format("%064x", new java.math.BigInteger(1, authKey));truejako trzeciego parametru dohashpowinno rozwiązać sprawę, ale widzę, że i tak jest inny wynik...Sesja z pythona:
In [1]: s = '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234'In [2]: from hashlib import sha256In [3]: sha256(s).digest()Out[3]: ' echo hash('sha256', '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234');3c4cc9cdefab849c01169d6311e225c59a4e9f1800989b549b104958358a0f5dphp > echo hash('sha256', '67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd428341234', true);`
Zwraca domyślnie toString obiektu - które z tego co kojarzę zawiera typ i hashcode, musisz zrobić
System.out.println(Arrays.toString(authKey));
Zmień IDE na jakieś normalne, np Intellija to nie będziesz robił takich błędów ;)
Intellijka sama proponuje poprawę takiego kodu.
Albo coś źle robisz (źle korzystasz z api wystawionego przez zewnętrznego dostawce), albo ten dostawca #!$%@?ł :P Jeżeli ten kod ma zwrócić hasha jako Stringa to musi on być przekonwertowany z tablicy bajtów na Stringa. Zwracanie toStringa IMO jest bezcelowe
Sprawdziłem dokładnie jeszcze kod w Javie. Zwracany jest do mnie nie toString obiektu, ale coś takiego:
return Base64.encodeToString(bytesOfToken, Base64.NO_WRAP);Czy to jakoś rozwiązuje problem? Chyba niewiele to zmienia, bo do base64 leci nadal toString obiektu? Mam rację?
W oryginale wygenerowany jest hash w podanym wcześniej sposób i zwracane jest z tego base64. Czy to w ogóle ma sens? Podejrzewam, że i tak do base64 leci efekt metody toString na obiekcie? Mam rację?
Próbowałeś w PHP zrobić tak?
$deviceId = "67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd42834";
$pin = "1234";
$key = $deviceId . $pin;
$authKey = hash('sha256', $key, true);
print base64_encode($authKey);
W takim wypadku przyjmuje on tablicę bajtów, więc nie ma mowy o żadnym toStringu. To nie jest tak, że zawsze możesz wrzucić obiekt do wywowałania metody i jeżeli typ nie pasuje to zostanie wywołane toString. Java jest mocno
Dzięki wszystkim za tak aktywną dyskusję, sprawa się wyjaśniła.
W przykładzie przedstawiłem nieco uproszczoną wersję kodu po obydwu stronach, dlatego może nie było wszystko do końca jasne.
Ostatecznie sprawę rozwiązało dodanie w odpowiednich miejscach w PHP trzeciego parametru "true" dla metody hash.
Dzięki wszystkim za pomoc, można się rozejść :)
Pozdro :)