Salva hash per un insieme finito di stringhe che richiederebbe molto tempo per invertire la ricerca tramite tabella, ma anche consentire il raggruppamento

1

Diciamo che ho un insieme finito di stringhe (diciamo mezzo miliardo). Non ci possono essere altre stringhe di cui avrei bisogno per memorizzare oltre questo mezzo miliardo di corde. Le stringhe possono essere ripetute nel mio database. Ho bisogno di un modo sicuro per archiviare questi valori in modo che io possa prendere l'input dell'utente, eseguirlo attraverso lo stesso hash e verificare se il valore esiste. Ho anche bisogno di un modo per essere in grado di raggruppare i valori che erano uguali prima dell'hash senza troppo esposizione al valore originale. Infine, i valori possono essere aggiunti in qualsiasi momento, quindi il raggruppamento dei valori non può essere eseguito prima dell'hashing. Non avrò mai bisogno di conoscere il valore di stringa originale che è stato hash.

Devo essere in grado di raggruppare le righe in base a questo valore, ma non ho bisogno di sapere qual è il valore originale in cui sono stati raggruppati.

Per brevità della mia domanda, se avessi usato un hash (CRC-32) di per sé, avrei finito con i valori nella tabella seguente. (Sono not che useremo CRC-32, è per un esempio perché è un hash breve e facile da dimostrare la domanda. Probabilmente ho usato bcrypt o PBKDF2)

                   Original
                   Value
Id Name  Hash      Not Stored
-----------------------------
1  Erik  68EFFF54  Apple       
2  Tim   1A69B44E  Orange
3  John  68EFFF54  Apple       

Quindi ovviamente Erik e John hanno lo stesso hash che possono essere raggruppati. Tuttavia, poiché hanno lo stesso hash esatto in un insieme finito di valori, non sarebbe troppo difficile per un utente malintenzionato ottenere tutti i valori possibili, eseguire l'hash contro tutti e ottenere una tabella di ricerca.

L'utilizzo di un Salt non sembra risolvere il problema, perché se il database fosse compromesso, non sarebbe essere troppo duro per creare una tabella con ricerche che includano i sali (ovviamente ci vorrebbe più tempo, ma dubito di qualsiasi significato).

Potrei usare un Pepper ma se il codice è stato compromesso, ciò potrebbe anche essere un problema.

Mi sembra che la soluzione migliore sia avere una colonna dove ho cancellato il valore + pepe + sale. Questa colonna verrebbe utilizzata per cercare l'input dell'utente. Ma sono ancora convinto di come sarei in grado di creare un modo sicuro per raggruppare i valori.

(Sono anche consapevole che CRC32 non è davvero un hash, è solo un checksum e che servono funzioni completamente diverse:)

    
posta Erik Philips 23.03.2018 - 22:59
fonte

1 risposta

1

Non sono esperto nel settore, ma questo sembra un buon caso d'uso per un Modulo di sicurezza hardware che cripta tutti hash prima di memorizzarli nel DB.

Utilizzando gli algoritmi appropriati, gli hash identici sarebbero identici quando criptati, quindi la tua esigenza di indicizzazione sarebbe soddisfatta.

Un utente malintenzionato con accesso al database non sarebbe in grado di ricostruire gli hash. Per costruire una tabella di ricerca, l'attaccante richiede un accesso prolungato all'HSM. Questo dovrebbe soddisfare i tuoi requisiti di sicurezza.

    
risposta data 24.03.2018 - 06:41
fonte

Leggi altre domande sui tag