Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
La seconda generazione della citycar elettrica di Dacia passa alla piattaforma RGEV small di Renault Group, cresce di 15 cm in lunghezza e 18 cm in larghezza, adotta un motore da 80 CV e una batteria LFP da 27,5 kWh per 250 km WLTP. Prezzi da 17.900 euro, produzione a Novo Mesto in Slovenia.
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-06-2008, 11:35   #1
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
[Java + MySQL] Errore nella memorizzazione di una password criptata con MD5

Ho un piccolo problema.
In pratica quando il sistema aggiunge un nuovo utente prima di inserire la password nel DB MySql la cripta con MD5.

Codice:
	private String cryptPassword(final String password) {
		        MessageDigest md=null;
		        try {
		            //we use MD5 Algorithm
		            md = MessageDigest.getInstance("MD5");
		        } catch (NoSuchAlgorithmException ex) {
		            ex.printStackTrace();
		        }
		        md.update(password.getBytes());
		        return new String(md.digest());
     }
Quando un utente fa il login il sistema prende la password inserita dall'utente la cripta e la confronta con quella già criptata conservata nel DB.

Sembrava andare tutto ok, fin quando per caso non ho usato la password: "direttore".

In pratica usando nel prompt-msdos l'algoritmo MD5 con input "direttore" mi restituisce questa cosa
Codice:
àLa☺ ×fá`¾e¦☼â♫&
Mente nel DB se accedo tramite MySql Administrator trovo solo questo:


Non succede con le altre password provate fin'ora.
Come mai? E' lo spazio che crea problemi? Sono quei caratteri speciali? Uso male l'algoritmo MD5? come risolvo?

Aiutatemi per favore

NB: nel DB la password viene memorizzata come VARCHAR
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:05   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao,

premetto che non me ne intendo per nulla, nel senso che non so come funziona l'agoritmo MD5 percui potrei suggerirti un'amena cazzata.

Però leggendo qua:
Codice:
...
md.update(password.getBytes());
...
si nota che ti stai facendo restituire la codifica della tua String con il metodo getBytes() che usa il charset di default della piattaforma e se la stringa, per qualche ragione, non è codificabile con quel charset [non esiste una mappatura per il dato carattere, cosa che non credo sia nel tuo caso, oppure la stringa è "malformata"] il comportamento è indefinito.

Prova ad usare il metodo .getBytes(Charset charset) : specificando un Charset esplicitamente in caso di problemi con la stringa la sequenza di caratteri malformata viene rimpiazzata con un array di byte di default per il dato Charset (Vedi le API Javadoc a riguardo)

In ogni caso credo che sarebbe meglio usare la versione che prende il Charset esplicitamente definito dal programmatore, perchè il Charset di default (quello utilizzato dal sistema, ci pensa la Jvm a pescarlo) può essere diverso tra diversi sistemi operativi.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:16   #3
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Ciao,

premetto che non me ne intendo per nulla, nel senso che non so come funziona l'agoritmo MD5 percui potrei suggerirti un'amena cazzata.

Però leggendo qua:
Codice:
...
md.update(password.getBytes());
...
si nota che ti stai facendo restituire la codifica della tua String con il metodo getBytes() che usa il charset di default della piattaforma e se la stringa, per qualche ragione, non è codificabile con quel charset [non esiste una mappatura per il dato carattere, cosa che non credo sia nel tuo caso, oppure la stringa è "malformata"] il comportamento è indefinito.

Prova ad usare il metodo .getBytes(Charset charset) : specificando un Charset esplicitamente in caso di problemi con la stringa la sequenza di caratteri malformata viene rimpiazzata con un array di byte di default per il dato Charset (Vedi le API Javadoc a riguardo)

In ogni caso credo che sarebbe meglio usare la versione che prende il Charset esplicitamente definito dal programmatore, perchè il Charset di default (quello utilizzato dal sistema, ci pensa la Jvm a pescarlo) può essere diverso tra diversi sistemi operativi.
E se evitassi di usare stringhe?
Nel senso posso farmi restituire e quindi memorizzare direttamente byte[]?

Codice:
	private byte[] cryptPassword(final String password) {
		        MessageDigest md=null;
		        try {
		            //we use MD5 Algorithm
		            md = MessageDigest.getInstance("MD5");
		        } catch (NoSuchAlgorithmException ex) {
		            ex.printStackTrace();
		        }
		        md.update(password.getBytes());
		        return md.digest();
     }
Ecco alcuni risultati di criptaggio di varie password:

Quote:
[B@19821f
[B@addbf1
[B@42e816
[B@9304b1
[B@190d11
[B@a90653
[B@de6ced
Premere un tasto per continuare . . .
Secondo voi così va bene?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:21   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da luxorl Guarda i messaggi
E se evitassi di usare stringhe?
Nel senso posso farmi restituire e quindi memorizzare direttamente byte[]?

Codice:
	private byte[] cryptPassword(final String password) {
		        MessageDigest md=null;
		        try {
		            //we use MD5 Algorithm
		            md = MessageDigest.getInstance("MD5");
		        } catch (NoSuchAlgorithmException ex) {
		            ex.printStackTrace();
		        }
		        md.update(password.getBytes());
		        return md.digest();
     }
Ecco alcuni risultati di criptaggio di varie password:



Secondo voi così va bene?
no, perchè applicando il toString al byte array ti viene restituito il reference dell'oggetto.
Ti conviene fare come suggerito da Banryu utilizzando una charset comune (direi che UTF-8 dovrebbe andar bene così ad occhio).
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:22   #5
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Però così ho problemi a livello di Entity Bean.
Perché l'attributo password nell'EntityBean, essendo il campo password del DB MySql un VARCHAR, è una Stringa.
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:23   #6
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
no, perchè applicando il toString al byte array ti viene restituito il reference dell'oggetto.
Ti conviene fare come suggerito da Banryu utilizzando una charset comune (direi che UTF-8 dovrebbe andar bene così ad occhio).
Ok, testo subito
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:30   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Ti conviene fare come suggerito da Banryu utilizzando una charset comune (direi che UTF-8 dovrebbe andar bene così ad occhio).
Incredibile, non ho sparato una cazzata! [w i Javadoc]
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:33   #8
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Nota a margine: per l'amor di dio non usare MD5. E' rotto. L'algoritmo intendo.

Non va più bene per le password, usa bcrypt o sha-256 (o maggiore). Esistono implementazioni già fatte in java di entrambi gli algoritmi.

E se proprio devi usare MD5 (che è un colabrodo) almeno fai il salt delle password. Fare il 'salt' vuol dire aggiungere un pezzo arbitrario (tipo il nome dell'utente, o una stringa random che poi ti tieni sul db) alla password e criptare quello e non solo la password.

Esempio: invece di fare md5('direttore'), fai md5('utente.' + 'direttore'), oppure md5('$OMG!1PWNAGE!11' + 'direttore') dove la prima stringa è generata casualmente.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:35   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da shinya Guarda i messaggi
Nota a margine: per l'amor di dio non usare MD5. E' rotto. L'algoritmo intendo.

Non va più bene per le password, usa bcrypt o sha-256 (o maggiore). Esistono implementazioni già fatte in java di entrambi gli algoritmi.

E se proprio devi usare MD5 (che è un colabrodo) almeno fai il salt delle password. Fare il 'salt' vuol dire aggiungere un pezzo arbitrario (tipo il nome dell'utente, o una stringa random che poi ti tieni sul db) alla password e criptare quello e non solo la password.

Esempio: invece di fare md5('direttore'), fai md5('utente.' + 'direttore'), oppure md5('$OMG!1PWNAGE!11' + 'direttore') dove la prima stringa è generata casualmente.
fico non lo sapevo
io se non ricordo male usavo MD5 + il salt, ma non credevo che MD5 fosse combinato così male
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:44   #10
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Ok posso usare un altro algoritmo ma prima vorrei risolvere questo problemino

Niente!
Utilizzando UTF-8 ho lo stesso identico risultato, forse il charset di default è proprio UTF-8? ....comunque il metodo modificato è questo:

Codice:
  	 private String cryptPassword(final String password) throws UnsupportedEncodingException {
	        MessageDigest md=null;
	        try {
	            //we use MD5 Algorithm
	            md = MessageDigest.getInstance("MD5");
	        } catch (NoSuchAlgorithmException ex) {
	            ex.printStackTrace();
	        }
	        md.update(password.getBytes("UTF-8"));
	        return new String(md.digest());
     }
Giusto no?
Provo ad usare un altro charset? quale?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 12:59   #11
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Il problema sembra risolto usando UTF-16.
Forse gli 8bit di UTF-8 non erano abbastanza per quei caratteri speciali?
Posso stare sicuro secondo voi che adesso va bene con tutte le password?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 13:06   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Posso stare sicuro secondo voi che adesso va bene con tutte le password?
E chi lo sa? (io no).
Però seguirei i consigli di shynia: abbandona MD5 e fai il "salt" della password.
In questo modo credo tu possa raggiungere una ragionevole sicurezza.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 13:28   #13
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
E chi lo sa? (io no).
Però seguirei i consigli di shynia: abbandona MD5 e fai il "salt" della password.
In questo modo credo tu possa raggiungere una ragionevole sicurezza.
Si ok, uso SHA e faccio il salt
Speriamo che non mi rifà lo scherzetto del Charset, qualcuno può darmi maggiore sicurezza da questo punto di vista?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 13:47   #14
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
fico non lo sapevo
io se non ricordo male usavo MD5 + il salt, ma non credevo che MD5 fosse combinato così male
C'era un paper di due ricercatori cinesi che facevano vedere (con un metodo che solo un crittografo può capire) come generare dei plaintext con lo stesso md5-sum.

Qui trovi qualche link: http://www.schneier.com/blog/archive...d5_collis.html

Anche sha-1 credo non stia benissimo. Se mi ricordo bene, credo sia stato dimostrato che si possano produrre collisioni ogni 2^69 invece dei soliti 2^80... però non ti fidare, cerca qualche paper che avvalori questa cosa.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 13:55   #15
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da shinya Guarda i messaggi
C'era un paper di due ricercatori cinesi che facevano vedere (con un metodo che solo un crittografo può capire) come generare dei plaintext con lo stesso md5-sum.

Qui trovi qualche link: http://www.schneier.com/blog/archive...d5_collis.html

Anche sha-1 credo non stia benissimo. Se mi ricordo bene, credo sia stato dimostrato che si possano produrre collisioni ogni 2^69 invece dei soliti 2^80... però non ti fidare, cerca qualche paper che avvalori questa cosa.
Vabè è un sistema che dovrà girare intranet nella rete locale del dipartimento di ingegneria informatica.
Non sarà accessibile dall'esterno della LAN e gli utenti registrati non supereranno la dozzina...
Credo che con SHA posso stare sicuro, no?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 14:07   #16
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Vabè è un sistema che dovrà girare intranet nella rete locale del dipartimento di ingegneria informatica.
Non sarà accessibile dall'esterno della LAN e gli utenti registrati non supereranno la dozzina...
Credo che con SHA posso stare sicuro, no?
Beh se fai il salt, anche con md5 sei al sicuro se i requisiti dell'applicazione sono quelli. Basta aggiungere il salt, cosi da scoraggiare qualche studentello curioso che ha googlato 'rainbow tables'

Cmq se vuoi stare dalla parte dei bottoni, come si dice da me, dai un'occhiata a questa libreria http://www.softabar.com/home/content/view/46/68/

Ho dato un'occhiata veloce ai javadoc e nella classe ShaUtil c'è un metodo per convertire l'array di byte in esadecimale (sotto forma di stringa). Cosi stai a posto e usi ascii.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 14:25   #17
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da shinya Guarda i messaggi
Beh se fai il salt, anche con md5 sei al sicuro se i requisiti dell'applicazione sono quelli. Basta aggiungere il salt, cosi da scoraggiare qualche studentello curioso che ha googlato 'rainbow tables'

Cmq se vuoi stare dalla parte dei bottoni, come si dice da me, dai un'occhiata a questa libreria http://www.softabar.com/home/content/view/46/68/

Ho dato un'occhiata veloce ai javadoc e nella classe ShaUtil c'è un metodo per convertire l'array di byte in esadecimale (sotto forma di stringa). Cosi stai a posto e usi ascii.
Ti ringrazio. Ho visto il metodo nel javadoc...
Appena posso lo testo e vi faccio sapere.
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 14:43   #18
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
sul forum di html.it ho trovato questo

Quote:
Originariamente inviato da andbin
Volendo formattare l'array di byte secondo il formato tipico di un MD5 e volendo usare le nuove funzionalità di Java 5:

Codice:
public static String bytesToHexString (byte[] ar)
{
    StringBuilder sb = new StringBuilder (ar.length*2);
    for (byte b : ar)
        sb.append (String.format ("%02X", b));
    return sb.toString ();
}
Ma si possono studiare soluzioni ancora più performanti.
Dovrebbe essere la stessa soluzione che si ottiene usando quella libreria no?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2008, 15:24   #19
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Prova anche a documentarti sulla codifica Base64
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa Nuova Dacia Spring, del modello precedente resta...
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
SpaceX ha lanciato la missione Flight 15...
NVIDIA cerca il successore di Jensen Hua...
La CNSA annuncia la missione Tianwen-4 v...
Una valanga di wafer e memorie incombe s...
Microsoft 365, miglioramenti dopo il dow...
Un'IA attacca la tua azienda, ma per dif...
TSMC investe 1 miliardo di dollari in Op...
Niente più risposte IA nelle ricerche: M...
Allarmi bomba nelle scuole, il Viminale:...
OpenAI incassa 10 miliardi in tre mesi, ...
Continua il Black Friday Engwe: sconto e...
OnePlus 12 riceve Android 17 con una set...
Troppe patch generate dall'IA: anche chi...
Comprata e spenta il giorno dopo: cos'er...
Google lancia Tabletop, l'IA che trasfor...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v