Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-06-2008, 10: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, 11: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, 11: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, 11:21   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
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, 11: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, 11: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, 11: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, 11: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, 11:35   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
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, 11: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, 11: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, 12: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, 12: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, 12: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, 12: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, 13: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, 13: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, 13: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, 14: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


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Iliad: si consolida la partnership tecno...
Il SoC a 2 nm di Samsung non sfigura nel...
Prezzo shock per i Galaxy Buds FE + nuov...
Il nuovo SoC di Qualcomm vuole stupire: ...
Offerta lampo per pulire l'auto: aspirap...
I robotaxi di Amazon entrano in azione: ...
ECOVACS DEEBOT T50 PRO OMNI Gen2 domina ...
iPhone 17 Pro su Amazon: tutti i colori,...
Disney Plus da 2,99 euro al mese per 3 m...
Nuovo test di accensione dei motori per ...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
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: 15:16.


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