Crittografare alcuni campi di un database di una webapp PHP

di il
16 risposte

Crittografare alcuni campi di un database di una webapp PHP

Ciao, ho una webapp PHP collegata ad un db sql. Ho la necessità di crittografare con AES alcuni campi di alcune tabelle e ho visto che ci sono diverse possibilità, posso usare l'apposita funzione php per far arrivare i dati già cifrati al db, oppure possono usare un trigger direttamente sul db e fin qui ok.

Il mio dubbio è qual'è il modo più sicuro per conservare la chiave di cifratura.

Ovviamente la posso inserire in chiaro nei file php ogni volta che devo lanciare un encrypt o decrypt ad esempio, ma questo metodo è effettivamente sicuro o posso fare di meglio?

Sto un pochino approfondendo e ho visto che se uso PHP per cifrare e decifrare con le funzioni openssl_encrypt e openssl_decrypt, oltre alla chiave va salvato un vettore di inizializzazione e un tag quindi tre elementi.
Riguardo la riusabilità della chiave non viene specificato nulla, ma per il vettore e il tag ho letto in rete di cambiarli ogni volta che si cifra un nuovo dato (vanno generati ogni volta con i relativi metodi).

Ora, tutti sti dati dove è opportuno che vengano conservati per avere un alto livello di sicurezza?

16 Risposte

  • Re: Crittografare alcuni campi di un database di una webapp PHP

    E' moooolto piu' complicata di cosi'

    1) la teoria dice che la chiave di cifratura NON VA SALVATA da nessuna parte, altrimenti non vale perche' puo' essere ricuperata e quindi la sua utilita' diventa zero, ma DEVE ESSERE INSERITA OGNI VOLTA.

    In altri termini, NESSUNO, a parte il leggittimo proprietario, deve conoscere la password, il quale, a sua volta, non la dovrebbe salvare DA NESSUNA PARTE accessibile da un computer

    2) la chiave DEVE poter cambiare con una certa regolarita' (che potrebbe essere anche ogni millisecondo)

    QUINDI, concettualmente, non puoi salvare dati cifrati perche' se cambi la password, devi DEcifrarli e RIcifrarli con la nuova password.

    Ovviamente si puo' fare tutto, MA l'infrastruttura di sicurezza che devi mettere in piedi e' DECISAMENTE COMPLICATA. Ed e' praticamente impossibile che ti serva.

    Prova a spiegare PERCHE' vorresti cifrare i dati e che tipo di dati sono.

    Nel 99.99999999999% dei casi c'e' un approccio INFINITAMENTE piu' semplice e SICURAMENTE PIU' SICURO dell'approccio a cui hai pensato.
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Tutta la parte di teoria sulle password la conosco bene, ma se veramente si deve ragionare così anche in questo caso allora le funzioni php openssl_encrypt e openssl_decrypt diventano inutili...
    Comunque cercando di semplificare al massimo diciamo che c'è una tabella del database con diversi campi, alcuni di questi devono essere crittografati in modo che se anche qualcuno dovesse poter accedere direttamente al db non riuscirebbe ad interpretarli.
    Tali dati devono però essere accessibili nelle modalità previste tramite la web-application php collegata.
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Ciao,
    per db SQL intendi SQL Server?
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Ciao, attualmente sto usando MariaDb di xampp...
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Allora ci sono due aspetti principali che dovresti considerare:
    1. La protezione dei dati a riposo, in pratica i files fisici del database. In un modo o nell'altro i sistemi più evoluti hanno implementato TDE (Trasparente Data Encryption)
    2. Protezione dei dati all'interno del database in caso di accesso non lecito. Qui ci sono diverse casistiche, comprese sql injection, operatore di database che eccede rispetto alle attività assegnate, accessi tramite brute force, ecc

    Hai già risolto il punto 1? in genere si parte da quello
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Esatto a me serve trattare la gestione del punto 2. Ad esempio un tecnico che deve fare manutenzione al db ed accede tramite phpmyadmin non deve poter vedere i dati in chiaro di alcune colonne.
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Ecco qui un'implementazione di openssl_encrypt:
    https://bhoover.com/using-php-openssl_encrypt-openssl_decrypt-encrypt-decrypt-data/
    Il vettore di inizializzazione, random, lo conserva insieme allo stesso dato crittografato.
    L'esempio è ovviamente applicato al contesto sbagliato: criptazione di una password. Per la password si usano chiaramente algoritmi di one-way hashing , es. Argon2id e con l'apposita e comoda funzione di PHP, "password_hash".

    Dove salvare la chiave di criptazione? finchè lo fai nella stessa maccina in cui risiede l'app o il database, puoi arrivare fino a un certo livello di sicurezza.
    La password andrebbe salvata, criptata, su un'altro sistema.
    Cmq qualsiasi soluzione è sempre meglio che lasciarla in chiaro nel file di configurazione o nel codice sorgente.
    Prova quindi a vedere qui:
    https://github.com/vlucas/phpdoten
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Ok, ci ho lavorato un bel pò sopra e sono riuscito ad implementare il composer e phpdotenv nella mia app.
    Ora posso salvare e richiamare la chiave dal file .env, dove però è conservata in chiaro.
    l'accesso a questo file è inibito tramite .htaccess

    Questa soluzione è accettabile?
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    La maggior parte dei siti PHP è già tanto se implementa cifrature con password in chiaro su file config.php.
    Che livello di rischio hanno i dati che tratti? cosa dice l'analisi dei rischi?
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Quello che sto facendo non è destinato ad andare in produzione, o meglio è già in produzione ma non richiede un livello di sicurezza particolarmente elevato.
    Il punto è che sto facendo una trattazione accademica sullo stato dell'arte nella gestione di questi aspetti, e lo sto applicando a questo sistema. Quindi diciamo che il livello su cui mi devo tenere è quello a cui si dovrebbe tenere un'azienda per preservare i suoi dati e rispettare i paradigmi di Data protection by design e by default.
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Comunque ti volevo anche ringraziare, perchè ho scritto anche da altre parti su internet, ma sei stato l'unico che mi ha dato un'imbeccata concreta verso una soluzione accettabile, quindi grazie
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Legolas84 ha scritto:


    Comunque ti volevo anche ringraziare, perchè ho scritto anche da altre parti su internet, ma sei stato l'unico che mi ha dato un'imbeccata concreta verso una soluzione accettabile, quindi grazie
    Di nulla, quando posso do una mano volentieri.
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Sto proseguendo con il lavoro, e ho visto che le linee guida OWASP per la gestione delle chiavi dicono che la chiave andrebbe salvata in memoria sotto forma di array di bytes.
    Ci stavo lavorando ma non trovo la funzione giusta per convertire la chiave (che è una stringa) in array di bytes.
    Inoltre il file .env supporta solo stringhe e non array, però questo potrei risolverlo con JSON?
  • Re: Crittografare alcuni campi di un database di una webapp PHP

    Openssl_encrypt vuole la chiave come stringa
Devi accedere o registrarti per scrivere nel forum
16 risposte