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.