Ricordando le credenziali dell'utente nell'applicazione autonoma

4

Sto sviluppando un'applicazione standalone usando java, ho una schermata di login, in cui l'utente inserisce il suo nome utente e password. Per ogni istanza dell'applicazione, l'utente deve inserire le sue credenziali. Dal punto di vista dell'usabilità, ho pensato di tenere premuto il pulsante Ricordami. La mia domanda è, dato che non sto usando alcun database, come faccio a mantenere i dettagli dell'utente. Ho alcuni pensieri approssimativi, archiviandoli in un file di proprietà e recuperando. Penso che ci possano essere approcci migliori di quello che ho avuto. Qualche idea e suggerimento?

    
posta srk 13.12.2012 - 18:56
fonte

1 risposta

5

Non è raro archiviare le credenziali dell'utente in un file. È comune utilizzare un file di testo in cui ogni riga è un insieme delimitato di credenziali dell'utente, come il seguente.

user123:s8Z6dRBXxNHsh+qBLz1Tuw==
user789:EQrcOUm6Wau+VuBX8g+IPg==

Il formato non è importante, ma è buona norma evitare di memorizzare password non crittografate. Le credenziali sopra riportate utilizzano una funzione di hash crittografica che genera un array di byte "irreversibile", che viene quindi codificato in Base64 per ridurlo in caratteri ASCII. Questo è noto come "password digest". Quando una persona inserisce la sua password, viene prima convertita nel modulo digest che viene poi confrontato con il digest memorizzato.

SHA1 è la funzione hash raccomandata, e io uso Base64 perché produce digest più piccoli che codificano esadecimali. Ecco alcuni esempi di codice:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Base64;

public class TestAnything {

   public static void main(String[] args) {
      try {
         System.out.println(pwdDigest("coverme"));
      }
      catch(NoSuchAlgorithmException e) {
          e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
      } 
   }

   static String pwdDigest(String password) throws NoSuchAlgorithmException,  UnsupportedEncodingException {
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      byte[] digestBytes = md.digest(password.getBytes("UTF-8"));
      return new String(Base64.encodeBase64(digestBytes), "ASCII");
   }
}

È anche importante dove memorizzi questo file. L'hash semplicemente la tua password non è un mezzo sufficiente per proteggere i tuoi dati. Il file delle credenziali dovrebbe essere inaccessibile all'utente finale. Sebbene SHA-1 sia irreversibile dal punto di vista algoritmico, è suscettibile agli attacchi brute-force e rainbow-table e pertanto deve rimanere immagazzinato in modo sicuro. Soprattutto per le password deboli.

Presumibilmente, stai utilizzando una password perché stai proteggendo alcuni dati o risorse a cui l'utente non avrebbe altrimenti accesso. Non ha senso proteggere la password di un'applicazione se non ci sono dati o se i dati sono altrimenti accessibili all'utente dal file system. Quindi non sono sicuro di cosa stai proteggendo - dici di non avere un database.

Se si stanno proteggendo i dati sul file system locale, ed è accessibile solo a un utente, suggerirei di crittografare i dati utilizzando un codice AES e utilizzando il digest della password dell'utente come chiave di crittografia. Lo svantaggio di questo è che l'utente non può mai cambiare la propria password.

Se si proteggono i dati su un sistema di file condiviso o su un PC con condivisione di tempo, i dati dovrebbero probabilmente essere archiviati in una directory controllata dall'accesso e vi si può accedere usando un sistema di chiavi asimmetriche come RSA.

Se si sta proteggendo l'accesso a un servizio remoto, le password dovrebbero essere memorizzate sul sistema remoto.

Quindi abbiamo davvero bisogno di sapere cosa stai proteggendo.

    
risposta data 13.12.2012 - 20:58
fonte

Leggi altre domande sui tag