Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Java, criptare Password

    Ciao, ho un piccolo problema. Uso MYSQL come db. Durante la registrazione cripto la pass e la salvo nel DB criptata, soltanto che poi quando eseguo il login e inserisco la password nella servlet che poi automaticamente ricripto per fare il controllo se ho inserito una pass corretta....la pass recuperata dal db è praticamente diversa...da cosa può dipendere ?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Java, criptare Password

    Originariamente inviato da PerformancePort
    Ciao, ho un piccolo problema. Uso MYSQL come db. Durante la registrazione cripto la pass e la salvo nel DB criptata, soltanto che poi quando eseguo il login e inserisco la password nella servlet che poi automaticamente ricripto per fare il controllo se ho inserito una pass corretta....la pass recuperata dal db è praticamente diversa...da cosa può dipendere ?
    Non so che cosa intendi esattamente per "criptare" .... generalmente/tipicamente la cosa buona e appropriata da fare è mettere nel db un "hash" della password (MD5, SHA-1 o affini).
    Dal momento che gli algoritmi di hashing lavorano su una sequenza di byte "crudi", l'unica questione particolare/delicata è quale charset usare per convertire un String (la password) nella sequenza di byte (byte[]) da usare come "input" dell'algoritmo di hashing.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Se non sbaglio per criptare una password basta semplicemente:

    Codice PHP:
    MessageDigest digest MessageDigest.getInstance("MD5");
    String a = new String(digest.digest("miaPass".getBytes("UTF-8"))); 
    e se volessi riportarla in chiaro?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    codice:
    String a = new String(digest.digest("miaPass".getBytes("UTF-8")));
    No, qui proprio non va.
    Dalla password ottieni un byte[] in un charset fisso/noto. Fin qui ok. Della sequenza di byte ne calcoli il "digest" e fin qui pure ok.
    Perché dal digest ricrei un String?? Non ha per nulla senso. Oltretutto il risultato del digest è un numero fisso di byte (16 per il MD5) i cui valori sono qualunque per un byte ... e non ha senso trattarli come "caratteri" (in nessun charset).

    Originariamente inviato da PerformancePort
    e se volessi riportarla in chiaro?
    Non puoi. Gli algoritmi di hashing sono "one-way", a senso unico.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok thanks...però mi sa che mi conviene crearmi un metodo che cripta e decripta, perchè facendo così una volta inserita la password se la dovessi perdere sarei fregato :P

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    però mi sa che mi conviene crearmi un metodo che cripta e decripta
    Non certo con un algoritmo di "hash". Nessuno ti vieta certamente di usare un algoritmo di cifratura ad esempio a chiave "simmetrica" .... ma dovresti comunque partire da qualcosa di noto, una chiave appunto, che deve essere usata nel codice, quindi o è "cablata" nel sorgente o memorizzata da altra parte. Con tutto ciò che ne comporta/deriva.
    E mi pare comunque una cosa abbastanza dispendiosa e inutile.

    Originariamente inviato da PerformancePort
    perchè facendo così una volta inserita la password se la dovessi perdere sarei fregato :P
    I siti web che memorizzano nel loro db un "hash" della password dell'utente infatti non ri-forniscono mai all'utente la password in chiaro!! (e daltronde tecnicamente non potrebbero, visto il concetto di "hash").
    Semmai permettono di ricreare una nuova password nel caso l'utente l'abbia smarrita. Approccio tipico: hai smarrito la password? Digita la tua email, e se è presente nel db inviamo la nuova password in chiaro (e nel db il nuovo hash).

    Ripeto: non stare a fare congetture o stratagemmi strani ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Anche qui hai ragione :P Mazza, hai sempre ragione te...il problema sai qual è? Supponiamo che mi registro nel sito e via email mi arriva la password. A me inizialmente nell'email è arrivata la password in chiaro, mentre su DB l'ho memorizzata criptata. Allora cosa faccio, devo fare il controllo se la password che ho ricevuto via email sia analoga a quella sul db. Quindi nella servlet inserisco la password che mi è arrivata e ancor prima di fare il controllo con quella sul db la cripto. Risultato finale...la password sul DB è diversa da quella criptata lato servlet

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    Allora cosa faccio, devo fare il controllo se la password che ho ricevuto via email sia analoga a quella sul db. Quindi nella servlet inserisco la password che mi è arrivata e ancor prima di fare il controllo con quella sul db la cripto. Risultato finale...la password sul DB è diversa da quella criptata lato servlet
    No, alt. La questione è questa. Nel DB hai un hash, supponiamo un MD5, come sia memorizzato nel campo della tabella ... dipende. Nel senso che qui hai diverse possibilità: o il campo è "binario" (quindi memorizza i 16 byte "crudi" del hash) oppure è una stringa e magari memorizza ad esempio la rappresentazione esadecimale del hash (quindi 32 caratteri 0-9/a-f).

    Quindi che nel campo ci siano 16 byte "crudi"

    06 63 a8 db bd a3 5d 37 86 81 27 4c 9b 00 7c e5

    oppure una bella stringa di 32 caratteri

    "0663a8dbbda35d378681274c9b007ce5"

    beh, concettualmente non cambia nulla, cambia proprio solo il tipo di campo a livello tecnico.

    Tu poi ricevi dall'utente una password "kdhfty", cosa fai? Nella tua servlet di login generi l'hash MD5, quindi ottieni:

    "kdhfty" --> 06 63 a8 db bd a3 5d 37 86 81 27 4c 9b 00 7c e5

    Se nel db hai i 16 byte "crudi", compari il contenuto dei due array byte[], se nel db hai la stringa, beh, formatti questo hash e confronti le due stringhe.

    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    non ti seguo, sul db la pass è un varchar a 255 byte, a quanto ho capito quello che vuoi dire tu e che nel db mette gli spazi per ogni carattere, nella stringa mia no...cmq anche nel db è un varchar...poi che intendi formattare l'hash?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    non ti seguo
    Nella tabella il campo della password potresti farlo come:
    - BINARY(16) cioè i 16 byte "crudi" 0x00...0xff del hash MD5
    - CHAR(32) (o VARCHAR anche più grande) che contiene una "rappresentazione" testuale del hash, ad esempio in esadecimale.

    Originariamente inviato da PerformancePort
    poi che intendi formattare l'hash?
    Da un byte[] ottenere un String con la rappresentazione ad esempio esadecimale: da una sequenza di byte 0x78, 0xAB, 0x0C ..... ottenere un String "78AB0C......"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.