MySQL AES_ENCRYPT lunghezza della chiave di stringa

1

In MySQL ci sono funzioni AES_ENCRYPT() e AES_DECRYPT() incorporate che prendono la forma di:

AES_ENCRYPT(str, key_str)

Quale lunghezza è richiesta per l'argomento key_str ? Può essere variabile? Qual è la lunghezza minima e massima della chiave di stringa?

    
posta Justin 30.07.2018 - 08:24
fonte

2 risposte

2

La funzione AES_ENCRYPT di MySQL non è sicura per impostazione predefinita, in quanto utilizza la modalità ECB se non diversamente configurato . La documentazione fornisce un esempio di come utilizzare la modalità CBC con una chiave a 256 bit (sebbene il loro esempio di chiave sia terribile):

mysql> SET block_encryption_mode = 'aes-256-cbc';
mysql> SET @key_str = SHA2('My secret passphrase',512);
mysql> SET @init_vector = RANDOM_BYTES(16);
mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);

Quale lunghezza chiave vuoi usare dipende da cosa block_encryption_mode puoi configurare. Le lunghezze delle chiavi supportate sono 128, 192 e 256 (che sono anche le sole lunghezze chiave consentite da AES).

Può essere visto qui che se la chiave fornita è troppo piccola, sarà riempita di valori nulli (a causa di memset ), e se è troppo grande sarà xo i byte extra con i primi key_size byte (ad esempio se la dimensione della chiave è 4 byte e la chiave fornita è 12345678, sarà xo 5678 con 1234 e utilizzerà il risultato come chiave). Per garantire la massima sicurezza, è necessario utilizzare una chiave casuale della dimensione che si configura AES da utilizzare. Per AES-128 si desidera una chiave casuale a 128 bit o 32 caratteri esadecimali:

SELECT AES_ENCRYPT('text', UNHEX('6133C3D40B2BF9267E85ED0C2FDDC686'), @init_vector);

Per AES-256 vuoi una chiave casuale a 256 bit, che è 64 caratteri esadecimali:

SELECT AES_ENCRYPT('text', UNHEX('08672D4D2424CFE10E5221BF2EB8409C57431B30B55D6AE2D167E5F9682EF711'), @init_vector);

La documentazione MySQL non rileva che il IV (vettore di inizializzazione) non deve essere riutilizzato per più crittografie e, naturalmente, l'IV deve essere memorizzato per consentire la decrittografia.

Va anche notato che nessuna delle modalità di crittografia di MySQL supporta fornire autenticità , e delle modalità supportate, ECB è terribile e CBC, CFB e OFB sono tutti malleable .

    
risposta data 31.07.2018 - 22:47
fonte
0

Lunghezza chiave variabile:

Sì, puoi utilizzare una lunghezza di chiave diversa se intendi utilizzare più chiavi. E la dimensione della chiave dipende dal tipo di dati.

Ad esempio, NSA considera le chiavi a 128 bit abbastanza buone solo per i dati con designazione SECRET. Per TOP SECRET, però, richiede chiavi a 256 bit. Il rapporto European Network of Excellence in Cryptology raccomanda anche chiavi a 128 bit per la protezione a lungo termine, ma afferma che le chiavi a 256 bit sono l'unica buona protezione contro i computer quantistici.

Dimensioni chiave:

AES supporta tre diverse dimensioni di chiave. Se si specifica una chiave più piccola, questa verrà automaticamente completata da AES.

  1. 128 bit
  2. 192 bit
  3. 256 bit

Le chiavi standard a 128 bit sono utilizzate in AES_Encrypt () e AES_Decrypt () . Tuttavia puoi estenderlo a 256.

Assicurati di selezionare il tipo di campo come binario perché AES_ENCRYPT() crittografa una stringa e restituisce una stringa binaria. AES_DECRYPT() decrittografa la stringa crittografata e restituisce la stringa originale.

Codice di esempio:

Tabella:

CREATE  TABLE 'user' (
  'id' BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  'first_name' VARBINARY(100) NULL ,
  'address' VARBINARY(200) NOT NULL ,
  PRIMARY KEY ('id'));

Inserisci istruzione con funzione di crittografia:

INSERT into user (first_name, address) VALUES (AES_ENCRYPT('John', 'usa2018'), AES_ENCRYPT('Obama', 'usa2019'));

Seleziona istruzione con funzione di decrittazione:

SELECT AES_DECRYPT(first_name, 'usa2018'), AES_DECRYPT(address, 'usa2019') from user;
    
risposta data 30.07.2018 - 08:54
fonte

Leggi altre domande sui tag