Ich verwende Hibernate/Java, um eine Entität in einer Datenbank zu persistieren. Die Entität hat ein Passwort Feld, das ein String ist. Wenn ich einen Benutzer in meiner Anwendung registriere, hasse ich das Passwort mit SHA-1 (ich bestätige, dass es ein wenig schwach ist). Dies erzeugt ein byte [] die ich dann zu String konvertieren mit new String(byte[] arr);
Immer, wenn ich möchte ein Benutzer anmelden, habe ich einfach den Hash-Passwort aus der Datenbank abrufen (wie String) und vergleichen Sie es mit dem Digest des Eingangs Passwort bei der Anmeldung hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
Wie man eine byte [] Eigenschaft mit Hibernate?
das funktionierte perfekt auf meinem Entwicklungssystem (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26) verwenden, aber auf sie auf unserem Server bereitstellen (JDK 1.6 unter Linux laufen), die entspricht Methode nev Er berechnet TRUE auch für gleiche Passwörter. Ich habe schnell ein neues Entwicklungssystem (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22) eingerichtet und es funktioniert auch nicht dort.
Ich bin mir der möglichen Codierungsprobleme bewusst, die in der Java-API-Dokumentation für die -Klasse angegeben sind und auch an einigen Stellen hier auf SO angegeben sind. Ich habe ein paar Codierungen in diesem Forum (z. B. Base64, Latin-1) vorgeschlagen und ich endete mit UnsupportedEncodingException. Ich denke, ich werde besser die String-Konvertierung vermeiden. Wie kann ich meine Datenbank so gestalten, dass die von Hibernate generierte Entitätsklasse byte [] für das Feld anstelle von String anzeigt?
+1, sehr gute Frage. Nebenbei, das ist keine Antwort auf Ihre Frage, ich hatte sehr viel Glück mit einigen der Commons Base64-Dienstprogramme in und aus der Datenbank gehen. –
Warum speichern Sie eine Zeichenfolge, die eine Zahl darstellt, anstatt die Nummer selbst zu speichern? – m0skit0
Verwenden Sie keine Runde Hashing, um Passwörter zu schützen. Verwenden Sie etwas wie PBKDF2 oder bcrypt mit zehntausenden von Runden - sogar 100k ist nicht unvernünftig. Das direkte Speichern eines 'byte []' mit fester Länge sollte für mehrere Datenbanken einfach sein, aber Sie können immer einen 'BigInteger' aus einem Byte-Array erstellen und diesen als numerischen Typ speichern. – erickson