2012-05-16 11 views
6

Estoy teniendo enormes problemas para almacenar información encriptada en una base de datos MySQL, mySam motorLuchando para almacenar información en el campo de la base de datos encrpted

que cifrar la información de esta manera:

function in($plaintext) { 
$cipher = 'rijndael-256'; 
$mode = 'cbc'; 
$key = 'key'; 

    $td = mcrypt_module_open($cipher, '', $mode, ''); 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    mcrypt_generic_init($td, $key, $iv); 
    $crypttext = mcrypt_generic($td, $plaintext); 
    mcrypt_generic_deinit($td); 
    return $iv.$crypttext; 
} 

los datos se almacenan entonces en un blob. Cuando llego a derypt la información, parece que alrededor del 10% del tiempo se ha dañado debido al almacenamiento en la base de datos.

Puedo verificar que la base de datos es el problema ya que he ejecutado scripts para cifrar y descifrar en masa los datos sin problemas.

¿Alguna idea? Gracias por adelantado ...

[editar rutina de descifrado]

function decrypt($crypttext) 
{ 
$cipher = 'rijndael-256'; 
$mode = 'cbc'; 
$key = '$key'; 

    $plaintext = ''; 
    $td  = mcrypt_module_open($cipher, '', $mode, ''); 
    $ivsize = mcrypt_enc_get_iv_size($td); 
    $iv  = substr($crypttext, 0, $ivsize); 
    $crypttext = substr($crypttext, $ivsize); 
    if ($iv) 
    { 
     mcrypt_generic_init($td, $key, $iv); 
     $plaintext = mdecrypt_generic($td, $crypttext); 
    } 
    return $plaintext; 
} 

Respuesta

2

i altamente duda de que he encontrado un error de base de datos MySQL ... "dañado" ¿cómo? ¿Podemos ver tu rutina de descifrado y script de prueba? ¿No es solo el relleno del tamaño de bloque con el que te has topado?

Relleno: crypt algos generalmente trabaja en bloques de datos (aes usando 128 bits) - los datos de entrada (¡y por lo tanto de salida!) Serán rellenos a esta longitud, y necesita almacenar toda la cadena de salida acolchada - y posiblemente la longitud de la entrada no acolchada, si sus datos de entrada son pf, una forma en la que no se puede determinar el relleno & eliminado automáticamente después del descifrado.

+0

También dudo que sea un error. Por corrupto quiero decir que cuando miro los campos descifrados son solo una cadena de caracteres sin sentido. ¿Podrías dar más detalles sobre el relleno de block pleae? – rix

+0

Tendremos que ver su rutina de descifrado, así como más información sobre cómo almacenar los datos en la base de datos; un script de reproducción completo sería agradable. – snemarch

0

Asegurar las contraseñas de texto simple en MySQL no es una buena idea ... también, por qué no usar SHA1 o hash MD5 ... obtendrá más respuestas de consice, luego cambie el algoritmo como mejor le parezca.

Básicamente

SELECT SHA1 ("secretpassword") será = 08cd923367890009657eab812753379bdb321eeb o blabityboo

SHA1 almacenará a 40 characterse, lo que significa que probablemente debería cambiar el tipo de datos de BLOB a varchar o nvarchar() < --- probablemente varchar ...

sin la construcción de su algoritmo no podemos decir cuánto tiempo el campo va a ser, de ahí la observación sobre el relleno.

Al seleccionar el pase con SELECT CHARACTER_LENGTH ("Contraseña secreta") obtendrá la longitud del campo encriptado. y luego puedes crear las restricciones apropiadas.

Espero que esto ayude.

Cuestiones relacionadas