C'è qualche vantaggio nell'ordinamento degli hasc + numeri di conto?

1

Abbiamo un database di codici di ordinamento (numeri a 6 cifre) e numeri di conto (numeri a 8 cifre) che utilizziamo per riconciliare gli account mensili con la tabella dei sostenitori.

Non c'è nulla nei dati ricevuti dalla banca che identifica in modo univoco il sostenitore, oltre al codice di ordinamento e al numero di conto. ... lo so, è fastidioso.

Sebbene questi dati non siano così sensibili come i dati delle carte (e non soggetto a PCI-DSS ), è ancora abbastanza sensibile e mi piacerebbe trovare un altro modo per fare la riconciliazione per ridurre la responsabilità di avere tutti questi dati.

La combinazione di codice di ordinamento e numero di account offre fino a 10 ^ 14 possibilità.

C'è un modo (usando una funzione PHP affidabile e consolidata) per cancellare i dati e archiviare solo l'hash, che mi permetterebbe di prendere un file mensile di -say- 1000 record e abbinarli al dati hash? O non c'è davvero alcun punto e invece concentrarsi su un rafforzamento della sicurezza intorno a questo db?

Il vantaggio di sicurezza che sto cercando è che il database non abbia un elenco pronto all'uso dei dettagli bancari delle persone. I dati dell'estratto conto bancario transazionale possono essere considerati di breve durata (vengono ricevuti crittografati, decrittografati, elaborati, cancellati).

Ho letto un utile confronto dettagliato delle funzioni di hashing ma ovviamente qui non stiamo parlando di password , e in effetti dobbiamo essere in grado di craccarli ogni mese! Hmmm.

MODIFICA: conclusione

Grazie alle risposte qui sotto, ecco cosa intendo fare:

Set-up

  1. Crea una mappa per i codici di ordinamento e i numeri di account per gli ID casuali
  2. Sostituisci i dati reali con i dati mappati.
  3. Cripta questa mappa usando PHP MCRypt AES 256 con una chiave fornita dall'utente mai memorizzata sul server
  4. Archivia la mappa crittografata sul server.

Ora: puoi prendere il database, non ottieni i dati o qualsiasi altro modo per decrittografarlo con la forza bruta, grazie alla mappa casuale.

Puoi anche prendere la mappa e capire come funziona (non fare affidamento sull'oscurità), ma devi comunque essere in grado di decifrare la crittografia per ottenere l'accesso alla mappa. Questo sembra un adeguato livello di rischio.

La riconciliazione

  1. Decifra il contenuto PGP dal banco localmente.
  2. Su SSL, carica le transazioni del mese e fornisci anche la chiave di decrittografia.
  3. Il server decrittografa la mappa, la applica ai dati caricati, memorizza i dati mappati per l'elaborazione successiva, elimina il file caricato non elaborato.
  4. L'utente elimina localmente i dati bancari decrittografati.

Questo significa che la mappa chiave e decrittografata si trovano solo nella RAM. Le transazioni del mese sono temporaneamente archiviate su disco, ma questo è un livello accettabile di rischio IMO (potrebbe usare un metodo di cancellazione sicuro come il bleachbit ecc.).

L'aggiornamento della chiave è semplice come fornire chiavi esistenti e nuove, decrittografare la mappa, crittografare la mappa, archiviare la mappa.

Se c'era la preoccupazione che la mappa decodificata fosse stata compromessa, anche questa potrebbe essere ricostruita, anche se è più difficile in quanto significa aggiornare tutti i dati memorizzati.

    
posta artfulrobot 03.02.2015 - 18:44
fonte

2 risposte

3

Diffida delle operazioni di hashing in cui le persone potrebbero determinare le caratteristiche dell'input. Una società ha utilizzato MD5 degli ID taxi per l'anonimizzazione, che è stata rapidamente annullata. Sì, è possibile prova qualche modifica hash fatta in casa che lo renderebbe meno ovvio di un semplice MD5, ma è sicurezza attraverso l'oscurità. Risoluzione quasi ogni funzione di hashing per ogni numero di conto a 8 cifre è banale, a quel punto i tuoi dati sono validi come testo in chiaro. Concatenare i numeri di conto con il codice di ordinamento non sarà molto meglio.

Quello che dovresti fare invece è creare una tabella / programma / qualsiasi cosa mappi i tuoi dati sensibili su ID casuali. Il tuo sistema richiederebbe l'accesso a quella tabella / programma per effettuare la conversione, puoi prendere le misure necessarie per proteggere quella tabella / programma (come la memorizzazione in un volume TrueCrypt) mentre lavori con i dati veramente anonimizzati.

    
risposta data 04.02.2015 - 00:21
fonte
1

Se consideri i numeri di conto bancario sensibili, allora sì vale la pena di eseguirne l'hashing.

Quando parliamo di hashing dovremmo sempre parlare di salare l'hash. In questo caso sarebbe dispendioso dal punto di vista computazionale pagare ogni hash separatamente, il che è l'approccio con cui dovresti sempre iniziare.

Dato che stai cercando di utilizzare questo valore come valore di ricerca basato sul testo semplice (numero di conto bancario + codice di ordinamento) se hai salato ogni riga individualmente, dovresti calcolare l'hash di ogni riga ricevuta usando il sale di ogni record individualmente. Questo rallenterebbe il processo da O (log (n)) a O (n) dove n è il numero di record che stai memorizzando.

Quindi suggerirei di avere uno solo di tutti i conti bancari, questo eviterà l'uso di tabelle arcobaleno generali per invertire il tuo hash, ma non impedirà a qualcuno di creare una tabella arcobaleno specifica per la tua applicazione. Quindi cosa occorrerebbe per memorizzare una tabella arcobaleno per tutti i possibili numeri di conto?

Ci sono 10 ^ 8 numeri di conto possibili e 10 ^ 6 possibili codici di ordinamento che danno 10^14 possibile (numero di conto + codici di ordinamento). SHA-1 richiede 20 byte da archiviare, quindi per memorizzare tutti i possibili hash per tutti i possibili bankccount + sortcodes prendi 20*10^14 byte che è 1819 Terabyte (TiB). Quindi sembra che creare un tavolo arcobaleno per invertire ogni hash sarebbe impossibile. SHA-256 richiederebbe 2910 TiB.

Vale la pena notare che questo sarà prenotabile da chiunque abbia una potenza di calcolo sufficiente, basata su SHA-256 e sulla velocità elencata qui ci vorrebbe un solo computer centrale circa 80 giorni per cancellare tutte le combinazioni di codice di ordinamento / numero di conto. Con un desktop moderno di altissimo livello, direi che questo potrebbe ridursi a giorni a cifra singola. Se ti interessa, puoi passare a una funzione hash più lenta come PBKDF2 ( guarda anche ) che puoi configurare per eseguire il più lentamente possibile.

Raccomandazione

Suggerisco di eseguire l'hashing di questi valori utilizzando SHA-256 o PBKDF2 e la funzione di hash utilizzando un global seme. Si prega di consultare il seguente pseudo-codice:

$salt = "A Random Long String I Did Not Copy From The Internet"
$iterations = 10000 // Make this number larger for the hash to be more secure/slower

function hashBankAccount($AccountAndSortCode){
    $result = hash("sha256", $salt . $AccountAndSortCode)
    // OR
    $result = hash_pbkdf2("sha256", $AccountAndSortCode, $salt, $iterations, 64);
    return $result
}

Puoi quindi memorizzare il risultato di questa funzione nel tuo database.

    
risposta data 04.02.2015 - 00:50
fonte

Leggi altre domande sui tag