MySQL AES_ENCRYPT longitud de la clave

6

AES_ENCRYPT usa una clave de 128 bits para cifrar los datos, pero ¿cómo MySQL maneja claves más largas o más cortas? Descubrí que PyCrypto para instancias recomienda transformar la clave mediante el uso de hashes MD5, SHA-1, SHA-2, etc. y luego usar la clave resultante para el cifrado. ¿Cómo funciona con MySQL?

    
pregunta joecks 28.06.2011 - 10:28
fuente

4 respuestas

4

Lo siento, pero lo encontré más tarde en RubyForum

"El algoritmo simplemente crea un conjunto de búfer de 16 bytes a cero, y luego realiza un bucle a través de todos los caracteres de la cadena que proporciona y hace una Asignación con XOR a nivel de bits entre los dos valores. Si iteramos hasta llegamos al final del búfer de 16 bytes, simplemente comenzamos de nuevo desde el empezando a hacer ^ =. Para cadenas de menos de 16 caracteres, paramos en el final de la cadena ".

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; }

que se ve así en 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

y apliqué eso 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

Probablemente sea aconsejable no usar una contraseña repetitiva como "MySQL=insecure! MySQL=insecure! " , ya que pondría a cero la clave resultante.

    
respondido por el joecks 29.06.2011 - 09:54
fuente
3

MySQL 5.5 no maneja otros tamaños de clave. Como se indica en enlace :

  

AES_ENCRYPT () y AES_DECRYPT () habilitan el cifrado y descifrado de datos usando el algoritmo oficial AES (Advanced Encryption Standard), anteriormente conocido como "Rijndael". Se utiliza la codificación con una longitud de clave de 128 bits, pero puede ampliar Hasta 256 bits modificando la fuente. Elegimos 128 bits porque es mucho más rápido y es lo suficientemente seguro para la mayoría de los propósitos.

Nunca intenté pasar una clave más grande a MySQL, pero creo que generaría un error o se truncaría a 128 bits.

No estoy seguro de si el uso de MD5 es el codominio completo porque no puedo encontrar ninguna prueba de que MD5 sea una suposición. Entonces, asumo que obtendrá less de seguridad mediante el uso de hashes MD5 ya que reduce el conjunto de valores posibles para sus claves. Esto sigue siendo muy subjetivo.

En cuanto a las claves más pequeñas, supongo que 0x1 == 0x00...01 por lo que sigue siendo una clave válida.

Por cierto, no entiendo por qué simplemente no genera una clave para el tamaño dado. Si tiene algunas restricciones (clave ya existente que desea reutilizar, ...) háganoslo saber.

    
respondido por el M'vy 28.06.2011 - 16:59
fuente
0

Por defecto, estas funciones implementan AES con una longitud de clave de 128 bits. A partir de MySQL 5.7.4, se pueden usar longitudes de clave de 196 o 256 bits, como se describe más adelante. La longitud de la clave es una compensación entre rendimiento y seguridad. funciones de cifrado

    
respondido por el i88.ca 18.05.2017 - 19:47
fuente
0

Tuve que hacer esto en PHP. Debe hacer el XOR como lo describe @joecks y eliminar el relleno para cualquier información cifrada de menos de 16 bytes como se describe aquí: enlace

Código de trabajo:

<?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) );
    
respondido por el Whisk 23.06.2017 - 10:30
fuente

Lea otras preguntas en las etiquetas