Attualmente sto lavorando a un programma di crittografia dei file utilizzando Java Cryptography Architecture.
Il mio piano è di avere un numero di file crittografati in cui ogni file ha una chiave AES diversa. Per tenere traccia dei file crittografati, includo anche un file di metadati che memorizza una voce per ogni file crittografato con i seguenti valori: nome file di testo normale, nome file cipher e chiave AES.
Il file di metadati viene quindi crittografato utilizzando una chiave AES derivata dalla password dell'utente.
La mia domanda è: devo implementare una modalità? e pensi che mantenere tutte le password nei metadati crittografati sia una pratica accettabile?
Ecco il codice a cui mi riferivo:
public class PasswordBasedEncryption {
PBEKeySpec pbeKeySpec;
PBEParameterSpec pbeParamSpec;
SecretKeyFactory keyFac;
// Salt
byte[] salt = {
(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
(byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
};
// Iteration count
int count = 65536;
int keySize = 128;
Cipher pbeCipher;
SecretKey pbeKey;
FileInputStream fis;
FileOutputStream fos;
/**
* constructor given a master password
* Use password based derivation function II to make AES key.
* used only for the metadata file encryption
* @param password
*/
public PasswordBasedEncryption(char[] password){
try{
keyFac = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
pbeKeySpec = new PBEKeySpec(password, salt, count, keySize);
SecretKey tempKey = keyFac.generateSecret(pbeKeySpec);
pbeKey = new SecretKeySpec(tempKey.getEncoded(), "AES");
pbeCipher = Cipher.getInstance("AES");
}
catch (Exception e){e.printStackTrace();}
}
/**
* constructor given a generated AES key
* each file has its own AES key to avoid known text attacks
* @param key
*/
public PasswordBasedEncryption(SecretKey key){
try{
pbeKey = key;
}
catch (Exception e){e.printStackTrace();}
}
public void encrypt(String filePath, String cipherName){
try{
File clearFile = new File(filePath);
fis = new FileInputStream(clearFile);
pbeCipher = Cipher.getInstance("AES");
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey);
CipherInputStream cis = new CipherInputStream(fis, pbeCipher);
File cipherFile = new File(Path.TEMP + cipherName);
fos = new FileOutputStream(cipherFile);
int read;
while((read = cis.read())!=-1)
{
fos.write((char)read);
fos.flush();
}
cis.close();
fos.close();
fis.close();
}
catch(Exception e ){e.printStackTrace();}
}
public void decrypt(String cipherName, String filePath){
try{
fis = new FileInputStream(Path.TEMP + cipherName);
File clearFile = new File(filePath);
fos = new FileOutputStream(clearFile);
pbeCipher = Cipher.getInstance("AES");
pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey);
CipherOutputStream cos = new CipherOutputStream(fos, pbeCipher);
int read;
while((read = fis.read())!=-1)
{
cos.write(read);
cos.flush();
}
cos.close();
fis.close();
fos.close();
}
catch(Exception e ){e.printStackTrace();}
}
/**
* Generate secret password used each time a new file needs encrypting
* @return
*/
public static SecretKey genPass(){
KeyGenerator keyGen;
try {
keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
return keyGen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}