2013-02-25 22 views
9

Sto facendo una domanda di assunzione per una società per cui lavoro. Ho avuto modo di proteggere contro l'iniezione SQL e alcune tecniche XSS. Il mio problema principale è mantenere le informazioni sensibili protette, come SSN e indirizzo, perché l'azienda ha bisogno di creare 1099 moduli per le imposte dei venditori.Come posso archiviare dati sensibili in un database MySQL?

Non so come fare questa parte, ma dovrei crittografare tutto e quindi decifrarlo quando entra nel database MySQL?

+0

Se lo si desidera proteggere, dovrebbe essere crittografato nel database MySQL, non solo durante il transito. – Jon

+0

Se può essere decifrato da te, in genere può essere decifrato da qualcuno che ha accesso al tuo database. Forse hai bisogno di assumere un professionista? – sjdaws

+0

Questa è una domanda terribilmente ampia, Jacob. Puoi focalizzarlo ancora? Se sei più interessato alla crittografia end-to-end (perché? Per garantire la riservatezza? Affinché i tuoi utenti si fidino di inviare i dati all'entità giusta?), Quindi estrai gli altri bit. Qual è il tuo background in questa area? Se è poco o nulla, lascia che ti suggerisca umilmente di fare qualche lettura offline: qualsiasi aiuto che possa rientrare in una risposta SO non sarà di grande aiuto. Il [OWASP] (https://www.owasp.org/index.php/Category:OWASP_Guide_Project) è un buon punto di partenza. –

risposta

9

Questa è una risposta eccessivamente semplificata e dovrebbe essere preso con un grano di sale, come la maggior parte delle risposte sulla sicurezza:

  • Usa SSL ovunque.

  • Utilizzare una chiave

Per l'archiviazione dei dati crittografati crittografia sicura, è possibile utilizzare un campo BLOB, e utilizzare MySQL di built in encryption functions. Esempio:

update mytable set myfield = AES_ENCRYPT('some value', SHA2('your secure secret key', 512)); 

Se si preferisce fare la cifratura/decifratura nel codice dell'applicazione, dare un'occhiata a Mcrypt funzioni di PHP.

  • crittografare l'input dell'utente
  • Conservare nel database
  • decifrarlo dopo averlo scaricato

Questa non è affatto una guida completa, ma è un inizio e meglio che non fare nulla.

Potreste essere in grado di saperne di più su https://security.stackexchange.com/

+0

quindi cosa dici di crittografarlo e inserire le informazioni crittografate nel database, quindi quando ne abbiamo bisogno per decrittografarlo in qualche modo in una pagina web sicura, non pubblica, separata? –

+0

Dovresti aver spiegato meglio la crittografia, è molto importante e, come sviluppatori, è nostro compito assicurarci di fare bene la sicurezza. Dai un'occhiata a [this] (http://stackoverflow.com/questions/16600708/how-do-you-encrypt-and-decrypt-a-php-string/30159120#30159120) risposta a una domanda, lui ha davvero un buon guida alla crittografia. – dspacejs

+0

È meglio non usare mcrypt, è abandonware, non è stato aggiornato in anni e non supporta il padding standard PKCS # 7 (née PKCS # 5), solo padding null non standard che non può essere usato nemmeno con i binari dati. mcrypt aveva molti bug [in sospeso] (https://sourceforge.net/p/mcrypt/bugs/) risalenti al 2003. Prendete invece in considerazione l'uso di [defuse] (https://github.com/defuse/php-encryption), è stato mantenuto ed è corretto. – zaph

1

Come implicito nei commenti, stai facendo una domanda enorme. Avete intenzione di bisogno di ricerca una serie di questioni distinte:

  • SQL Injection e come prevenirlo
  • XSS e come prevenirlo
  • crittografia dei dati dei moduli presentati utilizzando SSL
  • migliori pratiche per la memorizzazione di informazioni sensibili in un database

Sarebbe difficile indirizzarle tutte in una sola risposta. Suggerirei di eseguire alcune ricerche su questo sito per gli argomenti sopra menzionati.

5

query SQL con chiave inserita (come Wesley Murch suggests) non è una buona idea. Se lo fai:

update mytable set myfield = AES_ENCRYPT('some value', 'your secure secret key'); 

... e la query ottiene collegato (slowlog per inst.) La chiave segreta sicura viene catturato in formato testo, che non dovrebbe mai accadere. Tale query con la chiave segreta sarebbe visibile anche quando si esegue query come SHOW PROCESSLIST.

Problema successivo dove memorizzare la chiave di sicurezza? Nel file PHP? È di nuovo un testo semplice.

Crittografia dei dati:

Usa/crittografia a chiave pubblica privata (http://en.wikipedia.org/wiki/Public-key_cryptography). PHP ha un buon supporto per questo.

  • Le chiavi pubbliche possono essere memorizzate con l'utente in DB, è pubblico.
  • La chiave privata può essere crittografata con la password dell'utente. Quando l'utente esegue il login, decifri la chiave privata e la memorizzi nei suoi cookie (se usi SSL, non è così male) o sessione. Entrambi non sono perfetti ma migliori del semplice testo nel file php.
  • Utilizzare la chiave pubblica per crittografare, chiave privata per decrittografare.
  • Solo l'utente avrà accesso ai propri dati.

Se vuoi saperne di più, puoi usare google "crittografia controllata dall'utente" o "privacy a zero conoscenza".

inserti SQL/XSS:

La migliore protezione sono al sicuro app. Nessun dubbio. Se vuoi metterlo in sicurezza, puoi usare PHP IDS per rilevare gli attacchi: https://github.com/PHPIDS/PHPIDS

Ho una buona esperienza con esso.

Problemi correlati