Penso di aver compreso i casi applicativi giusti per le seguenti funzioni crittografiche, ma vorrei confermare la mia comprensione e anche propagare l'uso sicuro di cripto attraverso gli intertubes. La crittografia e la sua implementazione sono spesso incasinate e una comprensione sia di ciò che l'algoritmo fa sia dei suoi casi d'uso è davvero importante.
Ecco la mia comprensione:
Funzioni hash crittografiche (hash)
Una funzione di hash crittografica , dato un input, dovrebbe, quando implementata correttamente, generare un output "univoco" dato che ingresso. Esempi popolari di funzioni di hash sono SHA-1 e SHA-2 famiglie e l'algoritmo SHA-256 in quelle famiglie.
Dovresti usare una funzione di hash per "garantire" l'integrità di un file o di un payload, ma entrambi gli hash e i payload originali dovrebbero essere trasferiti solo su canali fidati / autenticati / crittografati perché chiunque può generare un hash da qualsiasi input. Non dovresti usare una funzione di hash direttamente nella derivazione della chiave, dovresti usare un KDF. Non si dovrebbe usare una funzione di hash per il caso d'uso di un codice di autenticazione del messaggio, poiché gli hash sono anonimi e possono essere generati senza la conoscenza di alcun segreto. Non si dovrebbe usare un hash direttamente per memorizzare le password immesse dall'utente, i KDF sono per questo.
Hashed Machine Authentication Codes (HMAC)
I codici di autenticazione dei messaggi occlusi sono usati per combinare una chiave segreta e un input per generare un hash in cui solo qualcuno possedere sia il payload / file di input originale e la chiave segreta potrebbe generare il codice di autenticazione dei messaggi con hash. Tutte le implementazioni HMAC dovrebbero essere implementate in base a RFC-2104 .
È necessario utilizzare un HMAC per validare in modo sicuro i contenuti del payload. Se si crittografa un file utilizzando una modalità di crittografia non autenticata come AES-CBC, è possibile utilizzare un HMAC con la chiave di crittografia e l'output crittografato per "autenticare" il payload. Ciò significa che puoi solo convalidare il contenuto del file crittografato se hai anche la chiave di crittografia. Ciò rende il file crittografato a prova di manomissione; puoi sapere con certezza abbastanza alta che il file è ciò che pensi sia, a condizione che la tua chiave sia unica. Un esempio più semplice di caso d'uso per HMAC è l'invio di un file su canali non fidati; se Bob invia un messaggio ad un file e un HMAC ad Alice ed entrambi sanno che la chiave è "1337p @ $$ w0rdz", Alice può determinare con alta probabilità che il file che ha ricevuto è lo stesso inviato da Bob. Se Mallory conosce anche la chiave, tuttavia, e Mallory è in grado di modificare l'e-mail ricevuta da Alice, Mallory sarà anche in grado di generare file di cui Alice si fiderà. Non dovresti usare un HMAC per l'hashing di una password inserita dall'utente con un "segreto" internamente noto, usa KDF per quello.
Funzioni derivazione chiave (KDF)
Le funzioni di derivazione delle chiavi sono funzioni di crittografia progettate per generare un output simile a un hash da un input di chiave segreta. Queste funzioni sono progettate specificamente per essere computazionalmente costose, in modo che la derivazione delle chiavi sia difficile. Esempi popolari sono PBKDF2 , BCrypt e Scrypt . Spesso usano internamente le funzioni hash per avvolgere l'input o l'output della chiave.
Ogni volta che hai a che fare con una password inserita dall'utente, dovresti usare un KDF. Ad esempio, se è necessario crittografare un file utilizzando AES-256 in modalità CBC, è necessario prendere la password immessa dall'utente, eseguirla tramite un KDF e quindi utilizzarla come chiave di crittografia. Se è necessario memorizzare le password immesse dall'utente in un database, passarle attraverso un KDF computazionalmente difficile e quindi memorizzarle nel database.
Questo in genere copre i diversi casi d'uso di quando dovresti e non dovresti usare queste tre operazioni di crittografia?