Sicurezza profonda: chiave di divisione in diversi punti

2

Uso la crittografia AES su un sito web. Al momento, la chiave è memorizzata nell'origine dello script PHP che esegue il processo di crittografia / decrittografia grazie a openssl. So che non è sicuro, quindi voglio mettere parti della chiave in diversi punti:

  • prima parte nell'origine PHP
  • seconda parte come variabile d'ambiente del server
  • terza parte come htaccess env var
  • altri luoghi nel caso in cui li ricordo

So che questo procedimento non aggiunge, alla fine, alla sicurezza, ma rende il cracking un po 'più difficile (considerando che non posso usare dispositivi hardware), perché il blackhat ha bisogno di ottenere tutte le parti , non solo la fonte di uno script.

La domanda riguarda il modo più sicuro per farlo.

  • dividere la password in 3 parti, inserendole nelle diverse posizioni menzionate e unendole quando ho bisogno della chiave completa
  • combinandoli in altri modi, come:

Cosa ne pensi? Grazie mille per il tuo aiuto utile

    
posta Surfer on the fall 15.11.2012 - 13:50
fonte

3 risposte

6

In sostanza, ciò che stai tentando di fare è mettere in backdoor l'account di ciascun utente in modo tale che solo l'utente e un singolo utente amministrativo possano accedere ai propri dati. Questo può essere ottenuto come segue:

us  = User salt  = Random unique value (not the same salt as used for authentication)
as  = Admin salt = Random unique value (not the same salt as used for authentication)

uk  = User key    = pbkdf2(user_pass, salt1, 256, rounds)
dk  = Data key    = random 256-bit key
ak  = Admin key   = pbkdf2(admin_pass, salt2, 256, rounds)
P   = RSA private key
p   = RSA public key

uk' = Encrypted user key    = dk ^ uk
dk' = Encrypted data key    = RSA_Encrypt(dk, p)
P'  = Encrypted private key = AES_Encrypt(P, ak)

m = message
iv = initialisation vector (random unique value)
c = ciphertext = AES_Encrypt(m, iv, dk)

Quindi memorizziamo uk' , dk' e iv con il set di dati che stiamo crittografando. Memorizziamo us con il record dell'account utente. Memorizziamo anche P' e as con il nostro record dell'account amministratore. La chiave pubblica P può essere memorizzata nel codice.

La decrittazione dell'utente funziona come segue:

  1. Calcola uk dalla password dell'utente e us .
  2. Xor uk' con uk per recuperare dk .
  3. Decrypt c usando iv e dk , dandoci m .

La decrittazione dell'amministratore funziona come segue:

  1. Calcola ak dalla password di amministrazione e as .
  2. Decrypt P usando AES_Decrypt(P', ak)
  3. Decrypt dk usando RSA_Decrypt(dk', P)
  4. Decrypt c usando iv e dk , dandoci m .

Nota che quando dico "encrypt" e "decrypt" in riferimento a RSA, non è una veramente crittografia, ma è più o meno semanticamente uguale.

    
risposta data 15.11.2012 - 14:56
fonte
3

Per mettere quello che Polynomial sta dicendo in un altro modo, se stai cercando di farlo in modo che la crittografia funzioni per i dati dell'utente in modo che solo l'utente e gli amministratori possano accedervi, il punto critico è di non archiviare la possibilità di ottenere il informazioni sul server. Per gli utenti, questo viene fatto tramite la loro password, per gli amministratori, è fatto attraverso la loro chiave privata (che può anche essere legata a una password.)

Per ciascun account utente, si crea una nuova chiave simmetrica. Memorizzate quella chiave crittografata in base alla password degli utenti in modo che solo l'utente possa ottenere quella versione. Quindi si memorizza anche la stessa chiave ma la si crittografa utilizzando la chiave pubblica dell'amministratore, in questo modo si garantisce che la seconda copia della chiave utente sia accessibile solo dal titolare della chiave privata dell'amministratore. Se la password dell'utente deve essere modificata dal punto di vista amministrativo, l'amministratore può decodificare la chiave utente con la sua chiave privata e crittografarla nuovamente in base alla nuova password dell'utente.

In definitiva, il limite principale è che l'utente amministrativo deve ancora fornire la chiave privata per fare qualsiasi cosa, quindi non sono sicuro se questo si adatta al caso d'uso o meno. Se hai bisogno che il sistema sia in grado di reimpostare automaticamente la password di un utente, devi avere un modo per ottenere la chiave di crittografia per ricodificarla con la nuova password utente.

Sebbene tu abbia ragione nel dire che non aggiunge molta sicurezza, direi che la soluzione migliore per difendersi in profondità attraverso più posizioni di archiviazione (se non hai un'opzione migliore) è usare più crittografie nidificate con differenti chiavi. Ad esempio, memorizzare una chiave simmetrica completa e completa in ogni posizione e richiedere che ciascuna chiave venga utilizzata in sequenza per la decrittografia della chiave dati e ruotarla regolarmente. Devo sottolineare che questo aggiunge una minima quantità di protezione, ma almeno fa il meglio di una brutta situazione se devi avere la possibilità di accedere automaticamente ai dati protetti.

    
risposta data 15.11.2012 - 18:48
fonte
0

Se ho capito bene, stai cercando il concetto di condivisione segreta .

Citando l'articolo di Wikipedia:

Secret sharing (also called secret splitting) refers to methods for distributing a secret amongst a group of participants, each of whom is allocated a share of the secret. The secret can be reconstructed only when a sufficient number, of possibly different types, of shares are combined together; individual shares are of no use on their own.

Se stai cercando esempi più concreti, cerca lo schema di Shamir , lo schema di Blakley .

Purtroppo non posso raccomandare alcuna libreria pronta per l'uso, ma ciò non significa che non esistano!

    
risposta data 24.09.2013 - 14:32
fonte

Leggi altre domande sui tag