Wpis z mikrobloga

Mirki z #php #andoiddev i #java, pytanko:
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?
  • 19
@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.
@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).

Próbowałeś w PHP zrobić tak?
$deviceId = "67817fc18fef04955b713bac1b2b34f760fad8017e6747edcfba63003fd42834";
$pin = "1234";

$key = $deviceId . $pin;
$authKey = hash('sha256', $key, true);
print base64_encode($authKey);
@zdzisiek-bula: rozumiem, że ten kod javy działa na androidzie? Bo nie podałeś skąd ta funkcja (biblioteka jakaś?) bo standardowe API javy to nie jest, a najbliżej podanego wywołania pasuje to: https://developer.android.com/reference/android/util/Base64.html#encodeToString(byte[], int)

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
@MicNeo: @rysi3k_: @GotoFinal: @MQs: @m_bielawski:
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 :)