lunghezza della chiave MySQL AES_ENCRYPT

6

AES_ENCRYPT utilizza una chiave lunga 128 bit per crittografare i dati, ma come MySQL gestisce chiavi più lunghe o più corte? Ho scoperto che PyCrypto per le istanze consiglia di trasformare la chiave usando gli hash MD5, SHA-1, SHA-2, ecc. E quindi utilizzando la chiave risultante per la crittografia. Come funziona con MySQL?

    
posta joecks 28.06.2011 - 10:28
fonte

4 risposte

4

Spiacenti, ma l'ho scoperto più tardi da RubyForum

"L'algoritmo crea solo un buffer da 16 byte impostato su zero, quindi su cicli attraverso tutti i caratteri della stringa che fornisci e fa un assegnazione con XOR bit a bit tra i due valori. Se iteriamo fino a quando abbiamo raggiunto la fine del buffer da 16 byte, ricominciamo da cominciando a fare ^ =. Per le stringhe più corte di 16 caratteri, ci fermiamo a la fine della stringa. "

bzero((char*) rkey,AES_KEY_LENGTH/8); /* Set initial key */ for (ptr= rkey, sptr= key; sptr < key_end; ptr++,sptr++) { if (ptr == rkey_end) ptr= rkey; /* Just loop over tmp_key until we used all key */ *ptr^= (uint8) *sptr; }

che sembra simile a Ruby

def mysql_key2(key) final_key = "finalKey = b' bzero((char*) rkey,AES_KEY_LENGTH/8); /* Set initial key */ for (ptr= rkey, sptr= key; sptr < key_end; ptr++,sptr++) { if (ptr == rkey_end) ptr= rkey; /* Just loop over tmp_key until we used all key */ *ptr^= (uint8) *sptr; } '*16 key = b'mySecretKey' for i, c in enumerate(key) : finalKey[i%16] ^= key[i] " * 16 key.length.times do |i| final_key[i%16] ^= key[i] end final_key end

e l'ho applicato a python:

def mysql_key2(key) final_key = "finalKey = b'%pre%'*16 key = b'mySecretKey' for i, c in enumerate(key) : finalKey[i%16] ^= key[i] " * 16 key.length.times do |i| final_key[i%16] ^= key[i] end final_key end

Probabilmente è meglio non usare una password ripetitiva come "MySQL=insecure! MySQL=insecure! " perché azzererebbe la chiave risultante.

    
risposta data 29.06.2011 - 09:54
fonte
3

MySQL 5.5 non gestisce altre dimensioni della chiave. Come indicato sul link :

AES_ENCRYPT() and AES_DECRYPT() enable encryption and decryption of data using the official AES (Advanced Encryption Standard) algorithm, previously known as “Rijndael.” Encoding with a 128-bit key length is used, but you can extend it up to 256 bits by modifying the source. We chose 128 bits because it is much faster and it is secure enough for most purposes.

Non ho mai provato a passare una chiave più grande per MySQL, ma suppongo che avrebbe prodotto un errore o troncato a 128 bit.

Non sono sicuro che MD5 usi il suo pieno codominio perché non trovo alcuna prova che MD5 sia una sorpresa. Quindi presumo che otterrai la sicurezza di less usando gli hash MD5 poiché riduci il set di valori possibili per le tue chiavi. Questo è ancora molto soggettivo.

Per quanto riguarda le chiavi più piccole, suppongo che 0x1 == 0x00...01 sia quindi una chiave valida.

A proposito, non capisco perché semplicemente non generi la chiave per la dimensione data. Se hai alcuni vincoli (chiave già esistente che vuoi riutilizzare, ...) faccelo sapere.

    
risposta data 28.06.2011 - 16:59
fonte
0

Per impostazione predefinita, queste funzioni implementano AES con una lunghezza della chiave a 128 bit. A partire da MySQL 5.7.4, è possibile utilizzare lunghezze di chiave di 196 o 256 bit, come descritto più avanti. La lunghezza della chiave è un compromesso tra prestazioni e sicurezza. funzioni di crittografia

    
risposta data 18.05.2017 - 19:47
fonte
0

Dovevo farlo in PHP. È necessario eseguire XOR come descritto da @joecks e rimuovere il riempimento per tutti i dati crittografati più brevi di 16 byte come descritto qui: link

Codice di lavoro:

<?php
    $key = 'SomeSecretKeyThatCanBeLongerThan16Bytes';
    $encodedString = [fetched from DB];

    $finalKey = array_fill(0, 16, 0);
    foreach (unpack('C*', $key) as $i => $char)
    {
        $finalKey[($i-1)%16] = $finalKey[($i-1)%16] ^ $char;
    }

    $dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, implode(array_map("chr", $finalKey)), $encodedString, MCRYPT_MODE_ECB, '');
    return rtrim($dec, ((ord(substr($dec, strlen($dec) - 1, 1)) >= 0 and ord(substr($dec, strlen($dec) - 1, 1 ) ) <= 16 ) ? chr(ord(substr($dec, strlen($dec ) - 1, 1))): null) );
    
risposta data 23.06.2017 - 10:30
fonte

Leggi altre domande sui tag