Disclaimer: while I looked into the design and implementation of ciphersweet back when it was published (or at least when I became aware of it), I didn't perform a full-blown audit & proof of security of the design, and I didn't look into the PHP implementation in depth (in large parts because I do not do much PHP work). Do not mistake this for an audit report (I only make those when I'm paid for it :P)
Ciphersweet usa un suono piuttosto noioso, un design noioso; Scott lo spiega, insieme alle affermazioni sulla sicurezza di Cyphersweet, nella sua risposta, quindi non lo ripeterò più.
Il punto principale di Ciphersweet, IMO, è che è più sicuro e più difficile incasinare rispetto alle alternative.
La "fuga di voci duplicate" che menzioni non si applica ai record completi (quelli sono crittografati con crittografia standard non deterministica) ma agli indici ciechi:
se indichi, per esempio, lo stato di HIV, quindi qualcuno con accesso in lettura al database può capire quali documenti hanno lo stesso stato di HIV, e da lì probabilmente recupera lo stato di HIV per tutti i record.
Questa è una fuga di informazioni fondamentale per gli indici ciechi: se hai sufficienti informazioni su SELECT
su tutte le righe con una data (funzione dello) stato dell'HIV, hai abbastanza informazioni da controllare se due file hanno lo stesso stato di HIV, quindi la crittografia più elaborata non sarà di aiuto in questo caso (incluso l'uso di crittografia deterministica, crittografia che preserva l'ordine / rivelatore, ...).
La buona notizia è che, a differenza di altri design (come la crittografia che rivela gli ordini), gli hash con chiave (sotto una chiave sconosciuta) non rivelano più informazioni se i valori sono uguali.
Ovviamente, non è sufficiente (come mostrato con l'esempio di stato dell'HIV), quindi ci sono 3 mitigazioni principali che puoi usare (e Ciphersweet le supporta tutte):
-
il più ovvio è non aggiungere indici ciechi su dati molto sensibili: se non vuoi esporre i dati sullo stato dell'HIV, perché stai creando un indice per interrogarli efficientemente?
-
Usa indici composti: se i dati su cui devi indicizzare sono troppo bassa entropia per essere inseriti in un indice cieco (ad esempio, stato dell'HIV), puoi aggiungerlo insieme ad altri dati (la documentazione fornisce l'uso del SSN in quell'esempio) e supporta SELECT
record con un dato stato dell'HIV e un dato SSN.
Questa è, IMO, l'opzione meno utile, dato che puoi direttamente SELECT
di SSN (supponendo che tu abbia un indice cieco su SSN) e poi controlli lo stato dell'HIV nel record decrittografato. Riservalo nei casi in cui non puoi avere un indice su uno dei campi (perché sono troppo a bassa entropia e / o alta sensibilità).
-
tronca il valore HMAC, in modo da ridurre la perdita di informazioni: diciamo che si dispone di record paziente, tutti con un nome univoco e supportano la selezione da esso [0]. Potrei verificare se esiste un determinato paziente aggiungendo un record (tramite l'applicazione) con quel nome, quindi controllando il database per un secondo record con lo stesso hash del nome, anche se l'applicazione stessa non mi concederà il permesso di cercare pazienti per nome.
Con un hash troncato, puoi fare in modo che ogni ricerca nell'indice cieco restituisca (in media) un piccolo numero di record; dì, se vuoi avg. 3 record per query, su 1 000 000 di record, si vorrebbe un hash con dimensione log2 (10⁶ / 3) ~ 18 bit. Ciò rende impossibile lo scenario che ho descritto.
Non credo che Ciphersweet fornisca un supporto particolare per l'evoluzione delle dimensioni degli indici ciechi man mano che la dimensione del database aumenta, sebbene dovrebbe essere fattibile. Per fortuna, l'unico problema con il non ridimensionamento di un indice cieco man mano che il database cresce, è un leggero sovraccarico di prestazioni: se il DB diventa 10 × più grande e ora contiene 10.000.000 di record, mantenendo lo stesso indice di 18 bit cieco in avg. 30 record selezionati, che l'applicazione decodifica e filtra; decifrare 30 record per trovare quello a cui sei interessato dovrebbe essere abbastanza veloce.
[0] In un caso d'uso del mondo reale, probabilmente sosterrai la selezione con una versione normalizzata (in minuscolo, spogliata di punteggiatura) del nome; Ciphersweet supporta gli indici funzionali.
TL; DR: Ciphersweet è sicuro, probabilmente molto più della maggior parte delle alternative; ci sono alcune avvertenze da tenere a mente, che esistono in tutti i database crittografati, e alcuni problemi operativi, ma sono tutti molto gestibili.