Come memorizzare nonce e chiave quando si lavora con libsodium secretbox?

7

Perché sto chiedendo?

Sono molto nuovo alla crittografia (quindi per favore sii paziente con me ...) e voglio evitare di fare errori inutili. Ho fatto molte ricerche, ma - a parte la maggior parte delle altre domande correlate alla programmazione - ho avuto difficoltà a trovare informazioni sufficienti per rendermi sicuro di me, che ora capisco come fare le cose per bene.

Qual è il contesto?

Sto lavorando su un webshop utilizzando PHP (> 7.2) e MySQL. Ho bisogno di memorizzare alcune informazioni personali. Tuttavia, questo non conterrà dati critici (come i dettagli di pagamento) - solo nomi, indirizzi e informazioni di contatto. Ciononostante, voglio crittografare questi dati, non ultimo per ottenere un po 'di esperienza. Questi dati saranno inseriti e letti dall'applicazione php, senza input da parte di un amministratore.

Sto ospitando questo sito su World4You, un fornitore austriaco. Non sono sicuro della parola corretta per questo (l'inglese non è la mia lingua madre), ma penso che chiameresti questo hosting condiviso. Tuttavia, ho letto di hosting condiviso, in cui altri utenti hanno accesso ai miei file - questo non è il caso qui.

Nelle tue risposte, considera queste circostanze come invarianti. Sono ben consapevole che c'è molto spazio per migliorare la sicurezza quando si tratta di hosting. E sono, ovviamente, felice di ogni suggerimento in merito a questo. Ma per favore aiutami anche a trovare la migliore soluzione data in queste circostanze.

Perché secretbox?

Secondo la mia ricerca, ci sono alternative di crittografia più forti a secretbox. Tuttavia, questa maggiore sicurezza può essere facilmente compromessa da una scarsa implementazione, specialmente se sei un dilettante come me. Secretbox è ancora abbastanza sicuro, ma molto più facile da usare e quindi la scelta migliore nel mio caso. Corretto?

Inoltre, libsodium ora fa parte di PHP (nelle versioni 7.2 e successive).

Le mie domande

Grazie al libsodium e-book ora so come generare una chiave e un nonce e come crittografare e decodificare i dati usando questi. Tuttavia, non sono sicuro di come memorizzare la chiave e il nonce.

Dove conservo la chiave?

La "migliore" soluzione (considerando le mie circostanze), che ho trovato finora, è quella di memorizzare la chiave in un file php, che vive al di fuori della radice del documento. È un modo accettabile di fare le cose? Ci sono opzioni migliori, che non richiedono modifiche significative alla mia configurazione?

Dove immagazzino i nonces?

Secondo me, i nonces non devono essere tenuti segreti. Quindi, dove tengo i miei nonces?

per esempio: se voglio cifrare le stringhe per le colonne-tabella "nome", "indirizzo" e "email", userei 3 nonce, giusto? Quindi, dovrei semplicemente memorizzare questi 3 nonce in tre colonne aggiuntive di questo stesso tavolo (questo in qualche modo intuitivamente "sembra" sbagliato)? O li conserverei altrove?

Quale tipo di colonna dovrei usare?

Da quello che ho raccolto, dovrei memorizzare i dati crittografati in una colonna di un tipo binario. Quindi un BLOB sarebbe la scelta giusta?

Inoltre, quale tipo di colonna dovrei usare per memorizzare nonces (se li memorizzo effettivamente in una tabella)?

Grazie mille!

    
posta wire417 25.05.2018 - 13:25
fonte

1 risposta

1

Non sono un esperto né ho mai fatto nulla con Crypto prima. SONO UN AMATORE !!! per favore non prendere ciò che ho da dire come conoscenza o saggezza in questa materia. Utilizzare a proprio rischio.

In realtà ho la stessa domanda. Gran parte della documentazione e della F.U.D. lascia che qualcuno stia imparando questa roba. Sono piuttosto sicuro che questo sia intenzionale per aiutare con la sicurezza attraverso l'oscurità e la confusione.

Ok, scherzi a parte, volevo espandere alcuni concetti che hai delineato che ho scoperto nel mio stesso viaggio lungo lo stesso percorso. Innanzi tutto, l'utilizzo della crittografia e il modo in cui viene implementato dipendono direttamente dal caso d'uso. Ad esempio, se desideri indirizzare i dati a riposo avrà una soluzione molto diversa, quindi scambierà messaggi segreti sul filo. Tutti utilizzano gli stessi algoritmi e strumenti, ma l'implementazione effettiva per la tua app sarà diversa.

Successivamente, la chiave (in secretbox) è la tua linfa vitale. Deve essere salvato in modo sicuro e nascosto. È anche permanente nel caso di memorizzazione dei dati a riposo. Nel tuo esempio, salvarlo al di fuori della radice del documento o possibilmente in un database dietro un firewall potrebbe essere la cosa migliore. Inoltre, molte implementazioni crittografano la chiave con una passphrase (questo è ciò che fa GPG / PGP). Puoi farlo prima di scriverlo su disco e salvare la passphrase ( randombytes_buf ) in una variabile di ambiente.

Il nonce è univoco per crittografia ... err ... per testo cifrato creato. Quindi, nel tuo caso sopra, serializzerei tutti e tre i campi in una stringa e li cripteremo con un nonce. Ora per decriptare (leggere) è necessario conoscere il nonce. È qui che i documenti e i post del blog diventano divertenti. Ho visto solo un esempio ( libsodium-wrappers ) dove hanno concatenato il buffer nonce con il buffer del testo cifrato un grande buffer con il nonce come prefisso.

Suppongo che un altro metodo sia serializzare entrambi in una forma analizzabile dal lettore. Questa è la mia domanda per il mondo criptico. Qual è un metodo di trasporto migliore?

Una stringa / carico utile binario:

nonce
vvvvvv
bada55123456789abcdf
      ^^^^^^^^^^^^^^
      ciphertext

OPPURE separare i due durante la serializzazione:

{
  "nonce": "bada55",
  "ciphertext": "123456789abcdef"
}
    
risposta data 13.07.2018 - 05:50
fonte

Leggi altre domande sui tag