Sto lavorando su un'applicazione java per creare una firma digitale per firmare un documento. Ho già creato la chiave privata e la chiave pubblica utilizzando ECC (crittografia a curva ellittica) e ora voglio memorizzare entrambe le chiavi nel database mysql.
Non ho alcun problema con la chiave pubblica, ma la mia preoccupazione è quella di memorizzare in modo sicuro la chiave privata.
Uso AES 128 bit per crittografare la chiave privata e la password a 6 cifre da utente a memorizzare nel database. Per crittografarlo, ho bisogno di generare sale e inizializzare il vettore.
Ma ora, per decodificarlo, devo anche conoscere lo stesso vettore di inizializzazione e di sale (iv) che uso per decifrare la chiave privata crittografata.
Domanda 1:
È sicuro memorizzare sale e vettoriale nella stessa tabella del database con la chiave privata? Attualmente codifico chiavi pubbliche e private, sale e iv e salva come stringa (tipo di dati VARCHAR) nel database.
Domanda 2:
Di seguito è riportato il flusso di lavoro corrente che progetto. È questa la migliore pratica? Non voglio fare troppi processi che influenzeranno l'utilizzo della CPU.
Creazione chiave
- Crea una chiave privata utilizzando ECC
- Codifica chiave privata (byte per stringa)
- Cripta la chiave privata usando AES
- Codifica chiave privata, salt, iv (Byte a Stringa)
- Archivia nel database come VARHCAR
Firma del documento
- Recupera la chiave privata dal DB
- Decodifica chiave privata, salt, iv
- Decrittografa la chiave privata
- Decodifica chiave privata
- Converti la chiave decodificata nella chiave privata effettiva per la firma
Snippet di codice per generare chiave e crittografia:
//Generate salt
Random r = new SecureRandom();
byte[] salt = new byte[8];
r.nextBytes(salt);
//System.out.println("salt: "+salt);
//initialize vector
byte[] vector = new byte[128/8];
r.nextBytes(vector);
IvParameterSpec ivspec = new IvParameterSpec(vector);
//System.out.println("iv: "+iv);
//initialize variables
String MsgToEncrypt = encodedECCprivateKeyBytes;
String userPin = ParamUtil.getString(actionRequest, "userPin");
Cipher ecipher;
//Generating AES key
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec mykeySpec = new PBEKeySpec(userPin.toCharArray(), salt, 10000, 128);
SecretKey tmp = factory.generateSecret(mykeySpec);
SecretKeySpec mySecretkey = new SecretKeySpec(tmp.getEncoded(), "AES");
//==> Create and initiate encryption
System.out.println("Initiate encryption alogrithm...");
ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//System.out.println("Algorithm to encrypt private key: " + ecipher);
ecipher.init(Cipher.ENCRYPT_MODE, mySecretkey, ivspec);
//System.out.println("SecKey: "+mySecretkey);