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! :)