Revisione sicurezza: questa classe wrapper mcrypt di PHP è sicura?

4

Update (6 February 2015):
It seems like the class in question has actually updated as a response to the answers here (through an issue, now closed, raised on github).


Stavo cercando una libreria facile da usare per crittografare i file in PHP. PHP fornisce funzionalità di crittografia tramite la libreria mcrypt . Tuttavia, ci sono molte opzioni e opzioni di configurazione, sufficienti per fare molti errori.

Quindi, invece di commettere quegli stessi errori, ho cercato un calo di classe (licenza open source, nessun vincolo di struttura) che ha già capito come applicare la funzionalità in modo sicuro. Ci sono molti esempi là fuori, ma non riesco a trovare alcun codice che sia stato recensito da chiunque abbia qualche conoscenza di base su questo.

Il miglior candidato che ho trovato finora è su github: Pixelfck / SymmetricEncryption
Il codice sembra scritto abbastanza bene, la classe è abbastanza compatta e ben commentata, quindi questo è almeno un buon segno. Eppure io non penso di essere qualificato per giudicare la parte della sicurezza di esso.

Qualcuno con uno sfondo più approfondito può leggere il codice e vedere se ci sono problemi?

Aggiornamento bounty

Ho alcune domande che spero di vedere risposte (non esitate a scegliere il codice a parte ancora di più):

Prima : la classe include due "implementazioni per l'utente" di funzioni crittografiche:

Queste due implementazioni sono effettivamente corrette?

Secondo : alcune cose "strane" che ho individuato:

  • Il passaggio "estratto" di HKDF è stato sostituito dall'uso di PBKDF2, è un'idea accettata per l'uso previsto?
  • Il numero di round utilizzati per PBKDF2 viene aggiunto (non crittografato) all'output dei dati crittografati e utilizzato senza / prima dell'autenticazione da parte di hmac. non è un rischio?
  • PBKDF2 è limitato a un solo "blocco", non è contrario a come è previsto che funzioni PBKDF2?

Terzo : alcune domande "minori":

  • Is 2 ^ 12 (= 4096) rappresenta effettivamente un numero minimo accettabile di round per PBKDF2 se usato in questo modo?
  • I 128 bit di sale per PBKDF2 sono effettivamente sufficienti "con margine di sicurezza da risparmiare"?
  • La chiave hmac è lunga 256 bit, è sufficiente in questo caso?

Forse mi preoccupo troppo di questo, ma preferirei non usare una libreria di terze parti che è difettosa.

    
posta Monika 02.12.2014 - 14:10
fonte

2 risposte

8

No, non è sicuro.

  • Il controllo HMAC è vulnerabile agli attacchi temporali. Poiché l'autore utilizza un confronto di stringhe standard, la verifica si interrompe non appena un carattere dall'HMAC fornito non corrisponde al carattere corrispondente dall'HMAC previsto. Quindi più lungo è il prefisso comune, più lungo è il controllo. Osservando attentamente tali differenze temporali, un aggressore potrebbe essere in grado di ricostruire l'HMAC previsto e "falsificare" dati arbitrari. Questo è un errore noto .
  • Il parametro length di strlen() e substr() fa riferimento a caratteri piuttosto che a byte in alcune configurazioni PHP, che interrompono le funzionalità critiche della libreria. Ad esempio, la popolare estensione "mbstring" fornisce implementazioni di encoding-aware di strlen() e substr() . In questo caso, più byte possono essere contati come un singolo carattere multi-byte.
  • È noto che la crittografia associata alla compressione è problematica in alcuni scenari (vedere l'attacco CRIME e BREACH contro SSL / TLS). La funzione di compressione è disattivata di default, però.
  • La configurazione della cifra è arcana. Ad esempio, la lunghezza desiderata dell'uscita PBKDF2 viene specificata indirettamente tramite la costante PBKDF2_BLOCK_COUNT , che rappresenta il multiplo minimo dell'output della funzione hash richiesto per la lunghezza di destinazione. Ciò crea un enorme rischio di errori da parte degli utenti, specialmente quando la libreria è commercializzata come una facile alternativa a Mcrypt.
  • L'autore confonde la dimensione del blocco di AES con le sue varie dimensioni di chiave. MCRYPT_RIJNDAEL_128 è non AES-128. I numeri delle costanti MCRYPT_RIJNDAEL_* si riferiscono alla dimensione del blocco dell'algoritmo Rijndael, mentre i numeri delle varianti AES si riferiscono a diverse lunghezze . AES è Rijndael con una dimensione del blocco di 128 bit e una dimensione della chiave di 128 bit, 192 bit o 256 bit. Quindi per ottenere AES in PHP, si usa MCRYPT_RIJNDAEL_128 e una stringa chiave con 16, 24 o 32 byte. La libreria utilizza una chiave a 32 byte per impostazione predefinita, il che significa che utilizza AES-256, non AES-128.
  • La derivazione della chiave sembra piuttosto strana: sia la chiave di crittografia che la chiave HMAC si basano sullo stesso output della funzione PBKDF2. L'unico motivo per cui sono diversi è perché le stringhe letterali "EncryptionKey" e "AuthenticationKey" sono mescolate nella chiamata HKDF. Questo non è necessariamente sbagliato. In effetti, RFC supporta in modo specifico un parametro di input aggiuntivo. Ma potrebbe essere più sicuro e più robusto generare abbastanza materiale chiave per entrambe le applicazioni e quindi dividerlo.

Il problema principale, tuttavia, è che la libreria si basa pesantemente su implementazioni interne quando dovrebbe utilizzare soluzioni standard. Ad esempio, combinando la crittografia e l'autenticazione dovrebbe essere fatto con AES-GCM. L'estensione PHP OpenSSL fornisce anche un'implementazione PBKDF2 completa.

    
risposta data 05.12.2014 - 04:18
fonte
2

La classe Pixelfck / SymmetricEncryption sembra colpire tutto ciò che cerco in un sistema di astrazione mcrypt. Usa le chiavi derivate usando quello che sembra essere un algoritmo standard (PBKDF2), impiega AES128 in modalità CFB e usa un hash_hmac di SHA256.

Direi che è ragionevole aspettarsi che questa classe fornisca la crittografia autenticata e non sembra che abbia nessuno degli errori più comuni.

L'unica cosa che vedo di cui devi essere a conoscenza è l'utilizzo di MCRYPT_DEV_URANDOM come una fonte casuale, che potrebbe portare a un indebolimento della sicurezza in caso di utilizzo estremamente elevato su un sistema senza una sorgente hardware casuale, ma per la maggior parte delle applicazioni dovrebbe funziona bene

Lo userei.

    
risposta data 02.12.2014 - 20:20
fonte

Leggi altre domande sui tag