PHP mcrypt Discussion CBC y ECB

0

Enlace de la publicación anterior sobre el reintegro

Hola a todos. Por lo tanto, tengo este escenario que necesito para cifrar un correo electrónico sin hash, porque, bueno, necesito descifrar y mostrar el correo electrónico más adelante. Pero me he encontrado con un problema.

Anteriormente utilicé estos métodos de cifrado y descifrado, corríjame si me equivoco, pero esta era una forma no segura de hacerlo:

function decrypt($encrypted_string) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, "!@#$%#^&*", $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}
function encrypt($pure_string) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, "!@#$%#^&*", $pure_string, MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

Aquí podría tomar una entrada de usuarios, cifrarla y verificarla con SQL si existiera en la base de datos. El problema ahora es que ahora he cambiado este método:

function encrypt($pure_string) {
    $key = pack('H*', "bab04b7e103a0cd8b54c58051cef23bc85abe129ddebae5e1d437e2fdb2a00a3");
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, utf8_encode($pure_string), MCRYPT_MODE_CBC, $iv);
    return $encrypted_string . "," . $iv;
}
function decrypt($encrypted_string) {
    $encrypted_string = explode(",", $encrypted_string);
    $key = pack('H*', "bab04b7e103a0cd8b54c58051cef23bc85abe129ddebae5e1d437e2fdb2a00a3");
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $encrypted_string[0], MCRYPT_MODE_CBC, $encrypted_string[1]);
    return $decrypted_string;
}

Pero aquí no puedo. (Obviamente la razón desde que el $ iv cambia de encriptación a encriptación). ¿Realmente necesito recibir todas las filas y descifrar el correo electrónico para verificarlo con la entrada del usuario?

¿O hay una forma más eficiente de hacer el cifrado y verificar MySQL? Actualmente estoy ejecutando este código PHP para verificar si el correo electrónico existe / es correcto:

//test_input() just escapes the user input
$rs = $con -> query("SELECT * FROM 'user' WHERE 'email'='" . encrypt(test_input($user_input_email)) . "'");
if($rs->num_rows > 0) {
    //email does exist
}else{
    //email does not exist
}

Tenga en cuenta que no alojo el sitio en un VPS sino en un host web normal, por lo que no se pueden instalar complementos como halite y libsodium.

Espero que alguien pueda guiarme en la dirección correcta! :)

    
pregunta Lagoni 07.09.2016 - 17:02
fuente

0 respuestas

Lea otras preguntas en las etiquetas