PHP mcrypt discussione CBC e ECB

0

Link per post precedente su overstack

Ciao a tutti. Quindi ho questo scenario che ho bisogno di crittografare un messaggio di posta elettronica senza fare un hashing perché, beh, ho bisogno di essere decifrato e mostrare l'email in un secondo momento. Ma ho incontrato un problema.

In precedenza ho utilizzato questi metodi di crittografia e decrittografia, correggimi se ho torto, ma questo era un modo non sicuro di farlo:

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

Qui potrei prendere in input un utente e crittografarlo e controllarlo con SQL se esisteva nel db. Il problema ora è che ho cambiato con questo metodo:

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

Ma qui non posso. (Ovviamente motivo dal momento che il $ iv cambia dalla crittografia alla crittografia). Devo davvero ricevere tutte le righe e decrittografare l'e-mail per controllarlo con l'input dell'utente?

O esiste un modo più efficiente per eseguire la crittografia e controllare MySQL? Attualmente sto eseguendo questo codice PHP per verificare se l'email esiste / è corretta:

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

Si noti che non ospita il sito su un VPS ma un normale web-host, quindi plug-in come halite e libsodium non possono essere installati.

Spero che qualcuno possa guidarmi nella giusta direzione! :)

    
posta Lagoni 07.09.2016 - 17:02
fonte

0 risposte

Leggi altre domande sui tag