PDA

Visualizza la versione completa : [JAVA] Digest delle password


gaetanoTwins
10-01-2006, 16:18
Salve ragazzi, devo memorizzare in un database gli username e le password di accesso degli utenti registrati.
Per una maggior sicurezza vorrei memorizzare le password non in chiaro, ma il loro hash.
Come posso fare a creare un hash di una password in java??
(Avete anche qualche consiglio su come aumentare la sicurezza??

Andrea1979
10-01-2006, 16:28
md5? se n'è parlato diverse volte qui sul forum, compreso un mio post con una banale implementazione dell'algoritmo.

Saluti,

unomichisiada
10-01-2006, 20:25
E questo era il codice il suo codice se non sbaglio


public static String hex(byte[] array) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1,3));
}
return sb.toString();
}

public static String md5 (String message) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return hex (md.digest(message.getBytes("CP1252")));
}
catch (NoSuchAlgorithmException e) {}
catch (UnsupportedEncodingException e) {}
return null;
}

gaetanoTwins
11-01-2006, 09:54
salve ragazzi ho provato a calcolare il digest di una password con queste istruzioni:

MessageDigest md = MessageDigest.getInstance("MD5");
md.updata (pasword.getByte());
byte [] newPassord = md.digest();

Inserisco nel database il digest della password, quindi newPassword;
quando provo a cercarlo nel database rifaccio prima le stesse istruzioni per calcolare il digest della password inserita e poi effettuo la ricerca, ma ho notato che il calcolo del digest della password è diverso dal digest calcolato quando l'ho inserita nel database.
In altre parole calcolo con le istruzioni sopra presentate il digest di una stessa password e mi da come risultato digest diversi!!!

alka
11-01-2006, 10:49
Ho unito le discussioni in quanto si sta parlando sempre dello stesso argomento.

Ciao! :ciauz:

Andrea1979
11-01-2006, 10:55
come fai il confronto? le due stringhe sono tutte e due lower/uppercase?

gaetanoTwins
11-01-2006, 11:13
La ricerca nel database la faccio con la semplice query

SELECT * FROM table WHERE password=result;

cmq ho provato a far stampare due volte il digest di una stessa password e mi da risultati diversi; nn capisco il perchè?

(Nn ho capito la sua domanda:le due stringhe sono tutte e due lower/uppercase? )

Andrea1979
11-01-2006, 11:34
Ma come fai ad avere due md5 diversi della stessa stringa? Ho avviene un qualche tipo di trasformazione all'atto dell'inserimento a database (per quello ti ho suggerito di controllare se la versione in db fosse con il case identico alla versione del digest).

Posta del codice...

La classe "completa" per l'md5 cho ho è:


import java.security.*;
import java.io.*;


public class encr {

public static String hex(byte[] array) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1,3));
}
return sb.toString();
}

public static String md5 (String message) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return hex (md.digest(message.getBytes("CP1252")));
}
catch (NoSuchAlgorithmException e) {}
catch (UnsupportedEncodingException e) {}
return null;
}

public encr() {
}
}


Comunque, una query del genere col connector si fa con i PreparedStatement:



String query = "SELECT * FROM pdt_user WHERE nome=? AND password = ?";
PreparedStatement pstm = conn.prepareStatement(query);
/*
* toLowerCase perché l'applicazione da me è interfacciata anche via
* PHP, che genera md5 in lowercase */
String pwd = encr.md5("password_in_chiaro").toLowerCase();
pstm.setString(1, "nome_utente");
pstm.setString(2, pwd);
pstm.execute();
rs = pstm.getResultSet();

gaetanoTwins
11-01-2006, 12:10
Cmq le password di cui sto calcolando il digest hanno sia caratteri maiuscoli che minuscoli...

Andrea1979
11-01-2006, 12:12
non ha importanza: md5 usa i caratteri dell' esadecimale per l'output e in input prende qualunque tipo di carattere.

Loading