Sto usando Hibernate/Java per mantenere un'entità in un database. L'entità ha un campo password che è una stringa . Quando si registra un utente nella mia applicazione, ho cancellato la password usando SHA-1 (riconosco che questo è un po 'debole). Questo produce un byte [] che ho poi convertire in String utilizzando new String(byte[] arr);
Ogni volta che voglio per accedere un utente in, ho semplicemente recuperare l'hash della password dal database (come String) e confrontarla con il digest della password di ingresso al momento del login utilizzando hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
Come mappare una proprietà byte [] con Hibernate?
Questo ha funzionato perfettamente sul mio sistema di sviluppo (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26), ma su di distribuirlo sul nostro server (eseguendo JDK 1.6 su Linux), il è uguale a metodo nev er valuta VERO anche per password uguali. Ho rapidamente installato un nuovo sistema di sviluppo (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22) e non funziona anche lì.
Sono a conoscenza dei possibili problemi di codifica indicati nella documentazione dell'API Java per la classe String e anche indicato in diversi punti qui su SO. Ho provato un paio di codifiche suggerite su questo forum (ad esempio Base64, Latin-1) e ho finito con UnsupportedEncodingException. Penso che starò meglio evitando la conversione String. Quindi, come faccio a progettare il mio database in modo tale che la classe di entità generata da Hibernate restituisca byte [] per il campo password invece di String?
+1, ottima domanda. Per inciso, che non è una risposta alla tua domanda, ho avuto molta fortuna ad usare alcune delle utility di Base64 di Commons che entravano e uscivano dal database. –
Perché dovresti memorizzare una stringa che rappresenta un numero invece di memorizzare il numero stesso? – m0skit0
Non utilizzare un round di hashing per proteggere le password. Usa qualcosa come PBKDF2 o bcrypt con decine di migliaia di round --- anche 100k non è irragionevole. Memorizzare direttamente un 'byte []' a lunghezza fissa dovrebbe essere facile per più database, ma è sempre possibile creare un 'BigInteger' da un array di byte e memorizzarlo come un tipo numerico. – erickson