Visualizzazione dei risultati da 1 a 6 su 6

Discussione: criptare file database

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19

    criptare file database

    Ciao, dopo aver letto e aver visto diversi esempi, sono a chiedere un consiglio. Il mio scopo è quello di proteggere con una password il database SQLite.
    Con il codice che sono riuscito a creare, cripto e decripto il db per proteggerlo con una password. tutto funziona correttamente....penso però che forse esiste un altro modo per proteggere un file con una password. Nel mio caso ogni volta che cripto e decripto creo un nuovo file e questo mi preoccupa, più che altro per il rischio di perdita dei dati e perchè mi sembra una operazione poco pulita. Avete qualche consiglio/suggerimento per raggiungere il mio scopo??

    classe che si occupa di criptare e decriptare:
    codice:
    public class CryptoUtils {
    
    
        private static final String ALGORITHM = "AES";
        private static String ENCRYPTION_KEY = "";
        private static final String ENCRYPTION_IV = "4e5Wa71fYoT7MFEX";
    
    
        public static void encrypt(String key, File inputFile, File outputFile)
                throws CryptoException {
            doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
        }
    
    
        public static void decrypt(String key, File inputFile, File outputFile)
                throws CryptoException {
            doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
        }
    
    
        private static void doCrypto(int cipherMode, String key, File inputFile,
                File outputFile) throws CryptoException {
            try {
                // Derive the ke
                ENCRYPTION_KEY = key;
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(cipherMode, makeKey(), makeIv());
    
    
                FileInputStream inputStream = new FileInputStream(inputFile);
                byte[] inputBytes = new byte[(int) inputFile.length()];
                inputStream.read(inputBytes);
    
    
                byte[] outputBytes = cipher.doFinal(inputBytes);
    
    
                FileOutputStream outputStream = new FileOutputStream(outputFile);
                outputStream.write(outputBytes);
    
    
                inputStream.close();
                outputStream.close();
    
    
                System.out.println("Encryption/Decryption Completed Succesfully");
    
    
            } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | IOException ex) {
                throw new CryptoException("Error encrypting/decrypting file" + ex.getMessage(), ex);
            } catch (InvalidAlgorithmParameterException ex) {
                Logger.getLogger(CryptoUtils.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    
        static AlgorithmParameterSpec makeIv() {
            try {
                return new IvParameterSpec(ENCRYPTION_IV.getBytes("UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
        static Key makeKey() {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA-256");
                byte[] key = md.digest(ENCRYPTION_KEY.getBytes("UTF-8"));
    
    
                return new SecretKeySpec(key, ALGORITHM);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
    
            return null;
        }
    }
    criptare:
    codice:
    private void btnEncryptActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
    
    
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
    
    
                    try {
                        CryptoUtils.encrypt(jTextFieldPasswordToEncrypt.getText(), inputFile, encryptedFile);
                        JOptionPane.showMessageDialog(rootPane, "Encrypted Succesfully");
                    } catch (CryptoException ex) {
                        System.out.println(ex.getMessage());
                        JOptionPane.showMessageDialog(rootPane, ex.getMessage());
                        ex.printStackTrace();
                    }
    
    
                 }
            });
            t.start();
    
    
    
    
        }
    decriptare:
    codice:
     private void btnDecryptActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
    
    
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
    
    
                    try {
                        CryptoUtils.decrypt(jTextFieldPasswordToDecrypt.getText(), encryptedFile, decryptedFile);
                        JOptionPane.showMessageDialog(rootPane, "Decrypted Succesfully");
                    } catch (CryptoException ex) {
                        System.out.println(ex.getMessage());
                        JOptionPane.showMessageDialog(rootPane, ex.getMessage());
                        ex.printStackTrace();
                    }
    
    
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
            });
            t.start();
    
    
    
    
        }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da chri.c Visualizza il messaggio
    Nel mio caso ogni volta che cripto e decripto creo un nuovo file e questo mi preoccupa, più che altro per il rischio di perdita dei dati e perchè mi sembra una operazione poco pulita.
    Non solo è poco pulita ... è pure poco performante ed anche parecchio insicura perché durante l'uso del DB da parte della applicazione, i dati sono decriptati e quindi "chiunque" li può accedere.
    Inoltre: quando ri-decripti il file, il file che era decriptato, lo cancelli? Se lo cancelli solo "logicamente" (come fa un delete normale) i dati restano fisicamente su disco e quindi ben poca sicurezza. Dovresti fare una cancellazione "sicura" e questo vuol dire: altra logica, altro tempo perso.

    Dovresti precisare COSA sono quei dati per valutare meglio come operare.

    E inoltre, una cosa evidente, nel run() di un thread che non è il Event Dispatch Thread vai a fare dei JOptionPane.showMessageDialog e questo è inappropriato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    Grazie per le importanti delucidazioni.....
    Stò creando un programma per salvare dati sensibili...possono essere qualsiasi cosa, carte di credito, codici ecc......

    Un consiglio su quale strada più sicura?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da chri.c Visualizza il messaggio
    Stò creando un programma per salvare dati sensibili...possono essere qualsiasi cosa, carte di credito, codici ecc......

    Un consiglio su quale strada più sicura?
    Dipendentemente da come sono fatte le tabelle, potresti cifrare solo certe colonne (che diventeranno dei BLOB con i dati binari risultato della cifratura). E la applicazione li decifra "al volo" solo per quel brevissimo tempo che serve per fare le varie operazioni.

    Bisogna vedere cosa accetti che sia "in chiaro" e facilmente ricercabile con SQL e cosa invece no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    ok

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    scusa, mi è venuta in mente una cosa....
    criptare solo alcune colonne delle tabelle mi rallenterebbe ugualmente le operazioni, anche se lascio in chiaro gli con cui faccio le ricerche......Tralasciando il fatto che il db quando è aperto è accessibile a tutti....mettiamo che il db fisico è criptato come faccio io e ogni volta che devo fare un'operazione (inserimento/modofica/eliminazione dei dati), lo decripto in un file temporaneo, faccio le operazioni nel file temporaneo, poi se i dati sono stati modificati, sovrascrivo il db fisico, altrimenti alla chiusura elimino il file temporaneo.
    Potrebbe essere leggermente migliore questa strada?

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.