Come rendere ricercabile un campo criptato?

3

Sto usando attr_encrypted per memorizzare molti campi. Il problema è che devo essere in grado di cercare alcuni di questi campi.

Prendi User.name .

Il mio database attuale ha User.e_name e User.e_name_iv . Anche se questo sembra essere ragionevolmente sicuro, non posso cercare nel mio database per "Joe Bloggs".

hashing

Ho quindi considerato di aggiungere un terzo campo hash ( User.e_name_hash ) che potrebbe essere utilizzato per trovare un campo basato sul termine di ricerca con hash. Quindi la ricerca 'Joe Bloggs' viene sottoposta a hash, rispetto a tutte le altre voci con hash, e viene trovato il record richiesto. Ma per fare questo, dovrei avere un costante di sale su tutti i dati in quel campo in quella tabella (anche insicuro).

Impasse

Avendo imparato che un sale costante è orribilmente insicuro, ho esaurito le idee su come rendere i campi criptati ricercabili. Le mie opzioni sono:

  1. Lascia questi campi in chiaro.
  2. Mantieni questi campi crittografati e aggiungi un campo hash con qualcosa di simile a un salto costante e lungo con SHA512 (il sale sarebbe costante all'interno di tutti i record in ogni campo del database ma unico per quel campo).
  3. Il mio database decodifica ogni record ogni volta che è necessaria una ricerca (eseguibile ora ma inefficiente man mano che il volume cresce).

Nota che i campi che devo cercare non sono super-sensibili - non sono simili alle cartelle cliniche o alle informazioni classificate.

Quali sono i tuoi consigli?

    
posta sscirrus 04.08.2017 - 13:02
fonte

5 risposte

2

Modificato : guarda la nota importante alla fine, che è stata aggiunta dopo che ho postato in origine e poi rileggere la domanda.

L'unica cosa che posso pensare è creare una tabella indicizzata usando gli hash. Ma questo indebolirà sicuramente la tua sicurezza dal momento che stiamo scambiando la crittografia completa che (si spera) non perde alcuna informazione sui contenuti per le tabelle di hash, che perdono informazioni sui contenuti dei dati di un utente (conoscendo il numero di termini indicizzati per un dato account dà un attacco a un punto di appoggio per l'analisi della frequenza tra le altre cose.

Nota: sto facendo la seguente ipotesi: hai un iv diverso per ogni utente.

Prima di crittografare una riga del database, è possibile leggere le righe e assegnarle token a una tabella che indicizzerà tali elementi. Dovresti quindi hash i token con un sale generato dal iv. Quindi, ora, per un determinato utente, "secretfoo" viene salvato nell'indice come c9a60f248c3a99e2b7004061d5c74e5f2240426f1f0f95eaf5843aa875e68542 .

Quando esegui una ricerca, dovrai scorrere tutti gli ivs per generare tutti i sali, quindi eseguire una ricerca per il token c9a60f248c3a99e2b7004061d5c74e5f2240426f1f0f95eaf5843aa875e68542 per trovare il record che contiene "secretfoo".

Questa sarebbe una ricerca più veloce, ma qui c'è uno scambio di velocità per la sicurezza. Dato che in pratica si è salvato un dizionario di hash per una determinata parola, se il database dovesse essere sottratto, è possibile (ma improbabile) che le informazioni indicizzate possano essere utilizzate per assemblare i dati originali. Per lo meno, può essere usato per assemblare i metadati relativi ai dati. Detto questo, sarebbe computazionalmente difficile.

Supponiamo che tu abbia 100.000 utenti con circa 100 righe per utente per una dimensione totale della tabella di 100.000.000 di righe di dati.

Decifrare tutti i 100.000.000 di milioni per eseguire una ricerca non indicizzata richiederà montagne di tempo.

Sotto il paradigma di cui sopra, devi solo generare 100.000 hash e cercare ognuno di quei una volta nell'indice per trovare i record che vuoi.Inoltre, possiamo abbinare intere stringhe (l'hash) e non è necessario eseguire ricerche di sottostringa.

Questo ha il vantaggio di calcolare 100.000 hash e di eseguire 100.000 ricerche su una tabella indicizzata BTREE che ci dà buoni risultati.

Come ha sottolineato Mike Ounsworth, devi ancora decidere cosa è sensibile e quali non sono i dati sensoriali per fare una ricerca; tuttavia, avere tutti i token SHA256 con hash è ordini di grandezza migliori del testo normale.

A CURA :

Dopo aver effettuato il mio post, ho riletto la tua domanda e mi sono reso conto che hai salvato l'iv nel database, il che renderebbe l'indice vulnerabile all'esfiltrazione.

L'unico modo per risolverlo è quello di archiviare l'iv in un database separato che non è esposto al web e che è accessibile solo tramite un'API. Questa è una configurazione comune nelle applicazioni conformi PCI.

Quando si effettua una query, l'applicazione Web deve chiedere al server sicuro la iv da cui genera l'hash ed eseguire la ricerca.

Questa è un'implementazione più complicata, ma se l'iv è nel database che è rivolto verso il Web, ed è exfiltrato, tutto ciò che devono fare è scorrere i ivs per decrittografare l'intero indice.

    
risposta data 04.08.2017 - 15:17
fonte
2

Conosci già la risposta: 3 se vuoi sicurezza.
Se questo diventa troppo lento, avrai bisogno di un computer migliore o più di uno. Così semplice.

Ad ogni modo, per favore non pensare di poter decidere quanto sono sensibili i dati, perché questo varia molto a seconda delle persone e delle situazioni . Vera storia: una persona che perde il 20% del reddito annuale perché si sapeva che mangiava gelato alla vaniglia. Non puoi immaginare come possa accadere? Esatto, ecco perché: non decidere per le altre persone cosa tenere segreto e cosa no. .

    
risposta data 04.08.2017 - 13:29
fonte
1

Dai un'occhiata a CryptDB . Cripta l'intero database ed esegue query sui dati crittografati senza decrittografarli sul lato DB. Hai bisogno di cambiare la tua app un po 'per lavorare con CryptDB, ma gli autori sostengono che si tratta di modifiche minori. È completamente indipendente dal linguaggio.

Questo è il whitepaper che descrive come funziona.

    
risposta data 06.08.2017 - 20:30
fonte
0

Sì, sembra proprio un impasse. Se stai cercando un crypto truck intelligente, non ne troverai uno.

Una delle proprietà è la crittografia chiamata indentinguibilità del testo cifrato che dice che dato un testo cifrato e una stringa casuale, e l'autore dell'attacco non dovrebbe essere in grado di dire quale è quale. Come corollario, se si hanno tre codici cifrati, due dei quali provengono dallo stesso testo in chiaro, l'autore dell'attacco non dovrebbe essere in grado di dire quale. Questo è il punto di usare sali unici o IV unici per ogni record.

L'idea di essere in grado di cercare conflitti di testo cifrato a un livello fondamentale con l'indistinguibilità del testo cifrato.

L'implicazione qui è che non è possibile crittografare le chiavi di ricerca e mantenere comunque qualsiasi tipo di prestazione. Avrai bisogno di decidere quali sono le cose sensibili e accettare che quelle non siano ricercabili. Potresti essere in grado di progettare in un certo senso in questo modo attaccando gli ID casuali su tutto e disponendo di più tabelle di ricerca.

    
risposta data 04.08.2017 - 14:41
fonte
0

Se hai bisogno di mantenere i tuoi dati caldi (dati che vengono interrogati) in forma crittografata, quindi decifrare mentre esegui la ricerca, questo rallenterebbe il tuo database e ti impedirebbe anche di fare qualche ottimizzazione avanzata della ricerca perché in pratica effettuerà scansioni complete della tabella ogni volta. L'altra opzione è TDE.

  • TDE (Transparent Data Encryption), la maggior parte dei fornitori di database lo supporta ora. e fondamentalmente crittografato nei file tablespace, le tabelle vengono crittografate mentre sono a riposo e non crittografate mentre sono calde. questo ti dà una buona sicurezza se vuoi che i tuoi backup siano sicuri e trasportabili. Questo metodo è molto scalabile, probabilmente Apple lo sta usando.

spero che questo aiuti. Se chiarisci questi requisiti, posso tornare indietro e modificare il mio suggerimento.

  • Accesso ai dati, applicazione che ha utilizzato i dati protetti?
  • Che fornitore di database hai? Oracle, Mysql, MSSQL.
  • I tuoi dati sono archiviati in grandi quantità?
  • Il tuo documento di database è basato?
  • Hai il controllo e l'accesso al tuo database?
risposta data 07.08.2017 - 07:44
fonte

Leggi altre domande sui tag