Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVA] Criptazione password

    Ciao a tutti io ho fatto un sito con jsp e database Access,il sito ha un meccanismo di registrazione/autenticazione il problema è che Access non consente la criptazione delle password e così mi chiedevo se qualcuno sa se esistono e dove posso trovare degli algoritmi Java di criptazione e decriptazione.

    Grazie e Ciao

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    ho trovato questo codice e adattato un pelo
    il salt e iterationCount li puoi cambiare come ti pare
    codice:
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.io.*;
    
    public class Crypt {
      Cipher ecipher;
      Cipher dcipher;
      
      // 8-byte Salt
      byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
                    (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
      };
      
      // Iteration count
      int iterationCount = 19;
      
      public Crypt(String passPhrase) {
        try {
          // Create the key
          KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
          SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
          ecipher = Cipher.getInstance(key.getAlgorithm());
          dcipher = Cipher.getInstance(key.getAlgorithm());
    
          // Prepare the parameter to the ciphers
          AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
      
          // Create the ciphers
          ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
          dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
      }
      
      public String encrypt(String str) {
        try {
          // Encode the string into bytes using utf-8
          byte[] utf8 = str.getBytes("UTF8");
      
          // Encrypt
          byte[] enc = ecipher.doFinal(utf8);
      
          // Encode bytes to base64 to get a string
          return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
      }
      
      public String decrypt(String str) {
        try {
          // Decode base64 to get bytes
          byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
      
          // Decrypt
          byte[] utf8 = dcipher.doFinal(dec);
      
          // Decode using utf-8
          return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
      }
    }

  3. #3
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    il fatto è che ci sono diversi modi per criptare una roba, quello che ho postato è un algoritmo basato su password
    ci sono algoritmi one way, molto sicuri, con cui puoi solo criptare una frase ma non decriptarla, e se cripti due volte la stessa frase ottieni la stessa stringa (ovviamente)
    ci sono algoritmi binari, al posto di stringhe generano array di byte
    devi decidere che algoritmo ti serve

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    anche se il codice sopra può andare credo che l'ideale sia utilizzare un'impronta di messaggio per autenticarsi, cioè appena l'utente inserisce la sua password viene generato il codice hash, utilizzando cmq un salt e volendo quelche iterazione, e quando lo reinserisce viene ricalcolato l'hash e confrontato con quello già salvato, ecco un esempio:

    codice:
    import java.security.*;
    
    public byte[] CalculateHash(String pass) {
    SecureRandom s = new SecureRandom();
    byte[] salt = new byte[12];//decidi tu quando grande fare il salt
    s.nextBytes(salt);
    
    MessageDigest md = MessageDigest.getInstance("MD5");//oppure SHA-1
    md.update(salt);
    md.update(pass.getBytes("UTF8"));
    byte[] hash = md.digest();
    
    return hash;
    }
    Fatto quasto hai ottenuto l'hash della password in formato di array di byte, fatto questo quando vorrai confrontare la password immessa con la sua impronta dovrai estrare il salt dal messaggio attaccarlo alla password inserita e confrontare:

    codice:
    import java.security.*;
    import java.util.*;//per Arrays
    
    public boolean isCorrect(String pass, byte[] hash) {
    //hash è la password precedentemente salvata
    byte[] salt;
    byte[] p = pass.getBytes("UTF8");
    System.arraycopy(hash, 0, salt, 0, 12);
    //se cambi le dimensioni del salt devi cambiare anche in arraycopy
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(salt);
    md.update(p);
    byte[] result = md.digest();
    return Arrays.equals(hash, p);
    }
    dovrebbe andare.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    ah una cosa, nel codice sopra viene utilizato il password based encryption con md5 e des, visto che il des usa una chiave da 56 bit è meno sicuro degli altri PBE offerti dal provider.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  6. #6

    Grazie

    Grazie a tutti per i suggerimenti, proverò

  7. #7
    Salve a tutti,

    ho provato ad utilizzare la funzione per criptare una password adattata per la mia pagina jsp:
    --------------------------------------------------------
    SecureRandom s = new SecureRandom();
    byte[] salt = new byte[12];
    s.nextBytes(salt);
    MessageDigest md = MessageDigest.getInstance("MD5"); //oppure SHA-1
    md.update(salt);
    md.update(passwd.getBytes("UTF8"));
    byte[] hash = md.digest();
    --------------------------------------------------------

    dove passwd è la mia password in chiaro
    hash mi da la stessa criptata.

    Quando da richiamo la funzione per decriptare(sempre adattata alla jsp):

    --------------------------------------------------------
    pwd = passwd.getBytes("UTF8");
    hash = rs.getString("passwd").getBytes("UTF8");
    System.arraycopy(hash, 0, salt, 0, 12);
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(salt);
    md.update(pwd);
    byte[] result = md.digest();
    --------------------------------------------------------

    la variabile hash è ricavata prendendo il valore inserito nella tabella, ma questo è di tipo String quindi devo fare getBytes per portarlo a byte di array.

    Inoltre rispetto alla funzione che ho visto a me se non assegno un valore a salt mi da NullPointerException.

    Il risultato è che confrontando hash e result trovo due array di byte differenti.

    Qualcuno mi sa dare aiuto?
    Grazie

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 © 2024 vBulletin Solutions, Inc. All rights reserved.