Używam Hibernate/Java do utrzymywania jednostki w bazie danych. Podmiot ma pole hasło, które jest String. Rejestrując użytkownika w mojej aplikacji, hash hasło za pomocą SHA-1 (uznaję, że jest to trochę słabe). W ten sposób powstaje byte [] które następnie przekonwertować do String użyciu new String(byte[] arr);
Ilekroć chcę zalogować użytkownika w, po prostu odzyskać zaszyfrowany hasło z bazy danych (jak String) i porównaj go z trawienia z hasła wejściowego przy logowaniu z użyciem hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
Jak odwzorować właściwość bajtów [] przy użyciu trybu hibernacji?
To działało idealnie w moim systemie rozwoju (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26), ale po wdrożeniu go na naszym serwerze (z JDK 1.6 na Linuksie), równa się metoda nev er ocenia PRAWDA nawet dla równych haseł. Szybko konfiguruję nowy system programistyczny (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22) i tam też nie działa.
Jestem świadomy możliwych problemów z kodowaniem podanych w dokumentacji interfejsu API języka Java dla klasy String, a także podanych w kilku miejscach na stronie SO. Próbowałem kilka kodowań sugerowanych na tym forum (np. Base64, Latin-1) i skończyło się na UnsupportedEncodingException. Myślę, że lepiej będzie, jeśli uniknę konwersji na String. Jak więc zaprojektować moją bazę danych tak, aby klasa jednostek generowanych przez Hibernate pojawiła się z bajtem [] dla pola 01 zamiast String?
+1, bardzo dobre pytanie. Na marginesie, który nie jest odpowiedzią na twoje pytanie, miałem bardzo dużo szczęścia przy korzystaniu z narzędzi Commons Base64 wchodzących i wychodzących z bazy danych. –
Dlaczego miałbyś zapisywać ciąg reprezentujący liczbę zamiast przechowywania samej liczby? – m0skit0
Nie używaj jednej rundy mieszania w celu ochrony haseł. Użyj czegoś takiego jak PBKDF2 lub bcrypt z 10s tysięcy rund --- nawet 100k nie jest nierozsądne. Przechowywanie "bajtów []" o stałej długości powinno być proste dla większej ilości baz danych, ale zawsze możesz utworzyć "BigInteger" z tablicy bajtów i zapisać je jako typ numeryczny. – erickson