Creazione di un'app Web con voci di database MySQL crittografate?

4

Ho una certa esperienza nella creazione di siti Web basati su PHP con accesso a MySQL, memorizzazione di dettagli utente crittografati, ma tutti gli altri campi sono in chiaro. Il mio progetto più recente richiederà la memorizzazione di dati sensibili nel database. Tutto ciò che sto ospitando.

Voglio configurare un sistema in cui un utente può accedere alle proprie voci e vedere i risultati in testo semplice, ma anche se fosse in grado di accedere a qualcun altro sarebbero stringhe crittografate e incomprensibili.

Ho un'idea di come ottenerlo, ma forse non è ottimale o esistono strumenti per farlo già in un modo più efficiente.

  1. Memorizza il nome utente come testo normale e la password crittografata con sha1 (). O entrambi crittografati con sha1 ().
  2. Prendi la password dell'utente (non quella crittografata, ma quella che ha digitato e usala definisce una chiave specifica per quel nome utente e password, che verrà quindi memorizzata come variabile di sessione.
  3. Cripta o decrittografa tutti i dati degli utenti con quella chiave.

A mio parere, anche se qualcuno ha ottenuto l'accesso al database e ha visto un elenco di nomi utente e password crittografati, non è stato possibile individuare la chiave specifica poiché non è memorizzata da nessuna parte. Pertanto, anche se l'accesso è stato acquisito, non è stato possibile decifrare il contenuto dei campi sensibili del database. Certo che sto costruendo in modi per impedirgli di accedere al database, ma come uno sforzo generale sembra una buona serie di passaggi.

Gli esperti possono commentare questo e offrire qualche consiglio? Grazie mille.

    
posta Joey O 16.07.2013 - 14:21
fonte

5 risposte

4

È certamente possibile crittografare i dati di ciascun utente nella tabella stessa, ma farlo solo dopo aver riconosciuto lo svantaggio. Se crittografate i dati, le opzioni di ricerca saranno limitate. Ad esempio, non sarai in grado di eseguire ricerche come name like 'Bob%' o cost > 1000 se le voci sono crittografate. Allo stesso modo, puoi utilizzare più database, uno per utente (o anche una tabella per utente), ma inizierai a riscontrare problemi nel mantenere gli schemi sincronizzati nel caso in cui la tua app si sviluppi e si evolva.

In definitiva, schemi del genere potrebbero non essere altrettanto sicuri di quanto pensiate. Ancora non impediscono, ad esempio, il modo principale in cui le persone accedono ai dati di altre persone ... semplicemente usando il loro computer o indovinando la loro password.

Credo che, onestamente, la tua domanda venga posta per inesperienza nella gestione di questo tipo di dati.

Il mio consiglio è di resistere all'impulso di usare espedienti di sicurezza . Progetta il database e le tabelle come faresti normalmente. E poi dedica tutto lo sforzo che avresti speso per crittografare i dati per garantire la sicurezza dell'applicazione lato server. Assicurati che ogni richiesta verifichi correttamente l'autorizzazione dell'utente ai dati richiesti. Assicurati di non avere problemi di iniezione. Usa ssl per le connessioni. Assicurarsi che i firewall corretti siano in esecuzione sul server.

    
risposta data 16.07.2013 - 18:37
fonte
4

In base a MySQL , crittografia AES ( Advanced Encryption Standard ) è il metodo migliore disponibile per fornire crittografia e decrittografia reversibili in SQL .

Precedentemente noto come Rijndael, le funzioni AES_ENCRYPT e AES_DECRYPT ora sono incorporate in MySQL in modo che tu possa prendere i dati dell'utente, crittografarlo con un sale, archiviarlo nel tuo database, quindi estrarlo di nuovo in seguito e decrittalo.

Definisci il tuo sale

Devi applicare un salt ai dati che crittografati. Questo è un codice speciale che utilizza l'algoritmo di crittografia che funziona un po 'come una chiave.

Dovrai fornire la stessa identica chiave per decifrare i dati e se un utente malintenzionato dovrebbe accedere al tuo database, non sarà in grado di decifrarlo senza conoscere il sale.

Se definisci il tuo sale in PHP come questo, sarai in grado di inserire la costante nelle tue istruzioni SQL più facilmente.

if(!define('SALT')) define('SALT','897sdn9j98u98jk');

Per inserire dati nel tuo database MySQL e crittografare le informazioni sensibili, dovrai inviare un comando come questo, insieme al tuo salt.

INSERT INTO your_table (username,email,shoe size) VALUES ('$username', AES_ENCRYPT('$email','".SALT."'), AES_ENCRYPT('$shoesize','".SALT."'));

Questo inserirà il nome utente in testo semplice, in quanto non è sensibile, ma crittografa l'email dell'utente e il messaggio di posta elettronica, per impedire che vengano visualizzati senza accesso a Salt.

A un certo punto, avrai bisogno di accedere ad alcuni dei dati che hai archiviato nel suo formato crittografato, e puoi farlo molto facilmente usando la funzione AES_DECRYPT di MySQL e lo stesso sale che hai usato quando hai crittografato i dati e inserito.

SELECT username, AES_DECRYPT('email','".SALT."') AS email, AES_DECRYPT('shoesize','".SALT."') AS shoesize FROM your_table WHERE username ='fred';

Se SELEZIONA i dati crittografati senza eseguirli tramite AES_DECRYPT o con il sale sbagliato o senza sale, otterrai una stringa brutta e illeggibile di caratteri dispari. Ciò significa che se un utente malintenzionato riesce ad accedere al tuo database, ma non ha accesso al tuo server per visualizzare il sale, non sarà in grado di leggere nessuno dei dati che hai memorizzato. Almeno, non senza grandi sforzi per provare e decifrare i dati.

L'aggiornamento dei record crittografati è molto simile all'inserimento. Fondamentalmente, basta applicare lo stesso sale e riemettere il comando AES_ENCRYPT per ricodificare nuovamente i dati e bloccarli in modo sicuro.

UPDATE your_table SET email = AES_ENCRYPT('$email','".SALT."'), shoesize = AES_ENCRYPT('$shoesize','".SALT."') WHERE username= 'fred';

Ricerca di dati crittografati utilizzando sia AES_ENCRYPT che AES_DECRYPT

Le cose diventano un po 'più complicate quando devi cercare i dati che sono criptati e quindi visualizzarli nel suo formato non criptato.

Supponiamo che tu voglia cercare un utente usando il loro indirizzo email, ma lo avresti crittografato nel database. Innanzitutto, è necessario crittografare l'indirizzo e-mail che si desidera cercare con AES_ENCRYPT e il proprio sale, e quindi è necessario utilizzare AES_DECRYPT per assicurarsi che MySQL lo decifri, restituendolo in un formato leggibile.

Puoi ottenere questo, usando un codice un po 'come questo:

SELECT user_username, AES_DECRYPT(email,'".SALT."') AS email, AES_DECRYPT(shoesize,'".SALT."') AS shoesize FROM your_table WHERE (email = AES_ENCRYPT('$q','".SALT."'));

Per ulteriori informazioni, si prega di consultare questo link: link

    
risposta data 30.01.2014 - 19:59
fonte
3

Per crittografare e amp; decrypt mysql data useremo AES_ENCRYPT() e AES_DECRYPT() funzioni. Queste funzioni utilizzavano l'algoritmo AES (Advanced Encryption Standard) ufficiale e & codificare i dati con una lunghezza della chiave a 128 bit. 128 bit è molto più veloce e abbastanza sicuro per la maggior parte degli scopi.

Perché AES_ENCRYPT() crittografa una stringa e restituisce una stringa binaria. AES_DECRYPT() decrittografa la stringa crittografata e restituisce la stringa originale.

AES è un algoritmo a livello di blocco. Quindi, quando i dati vengono crittografati, viene riempito. Quindi puoi calcolare la lunghezza della stringa del risultato usando questa formula:

1.) 16 × (trunc(string_length / 16) + 1)

Quindi, se la struttura del campo dell'indirizzo è = VARCHAR(100) ; //100 length of varchar Quindi prima della crittografia deve essere convertito

= 16 * (trunc(100/ 16) + 1)
= 16 * (6.25 + 1)
= 16 * 7.25
= 116

Quindi VARCHAR(100) deve essere convertito in VARBINARY(116) minimo. Suggerisco di usare un po 'di più come VARBINARY(150) in questo caso.

Perché se AES_DECRYPT() rileva dati non validi o riempimento errato, restituirà NULL. Ma è anche possibile per AES_DECRYPT() to return a non-NULL value (probabilmente garbage) se i dati di input o la chiave non sono validi.

La sintassi:

1.) AES_ENCRYPT(str, key_str);

2.) AES_DECRYPT(crypt_str,key_str);

Ricorda che la crittografia e la decrittografia si verificano in base a una chiave. Quindi devi tenere quella chiave in un posto segreto e usando la variabile puoi passare la chiave a mysql per crittografare e decodificare i dati.

AES_ENCRYPT() e AES_DECRYPT() possono essere considerati le funzioni di crittografia più crittograficamente sicure attualmente disponibili in MySQL .

Inserimento di dati come segue:

INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010'));

Recupero dei dati come segue:

SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user;

notazioni aggiuntive:

You'll need to apply a salt to the data that you encrypt. This is a special code that the encryption algorithm uses which works a bit like a key.

You'll need to provide the exact same key back to decrypt the data, and if an attacker should gain access to your database, they won't be able to decipher it without knowing the salt.

If you define your salt in PHP like this, you'll be able to pull the constant into your SQL statements more easily.

    
risposta data 29.01.2014 - 06:06
fonte
0

Sha1 () non è una funzione di crittografia, è una funzione di hashing. Ciò significa che è a senso unico. Puoi codificare una stringa usando sha1 () e produrrà un hash ma non puoi passare dall'hash alla stringa.

In secondo luogo, una password dovrebbe SEMPRE essere archiviata come hash e mai come testo normale. Ma naturalmente la sicurezza dipende dalla forza dell'hash e sha1 () non è la migliore che si possa usare. È obsoleto e non dovrebbe essere utilizzato per le password. Usa blowfish o pbkdf2 o simile per memorizzare le password e usa un Salt casuale diverso per ogni utente.

Quindi ott come già commentato. Potresti usare le funzioni mysql AES_Encrypt e Decrypt. Ma poi memorizzare la stringa di crittografia da qualche parte sicura. Ad esempio sul lato client, ma è necessario utilizzare SSL. O come una sessione in php, ma poi viene archiviata come testo normale in un file sul filesystem.

Oppure è possibile inviare i dati crittografati crittografati al client e decrittografarli sul lato client. Quindi, quando si inviano i dati, si cripta sul lato client un archivio del file crittografato nel database. Comunque non sono a casa con la crittografia con javascript.

    
risposta data 16.07.2013 - 15:20
fonte
0

In un progetto, utilizziamo i certificati digitali per eseguire la crittografia.

La crittografia / decrittografia viene eseguita sul lato client e richiede l'uso di un componente activex o di un'applet java.

Naturalmente, questo potrebbe essere eccessivo per il tuo scopo.

    
risposta data 29.01.2014 - 11:04
fonte

Leggi altre domande sui tag