Я хочу зашифровать все мои php-данные сеанса, и когда я хочу использовать эту информацию, расшифровать их для этого, я использую эти функции:
define("ENCRYPTION_KEY", "!@#$%^Soheil&*");
/**
* Returns an encrypted & utf8-encoded
*/
function encrypt($pure_string, $encryption_key) {
$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, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
return $encrypted_string;
}
/**
* Returns decrypted original string
*/
function decrypt($encrypted_string, $encryption_key) {
$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, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
return $decrypted_string;
}
и когда я хочу установить свои данные, я использую этот код:
$_SESSION["admin_username"] = encrypt($username, ENCRYPTION_KEY);
$_SESSION["seller_id"] = encrypt($user_array['id'], ENCRYPTION_KEY);
$_SESSION['seller_name'] = $user_array['name'];
$_SESSION['login_ok'] = encrypt('ok', ENCRYPTION_KEY);
теперь, когда я хочу показать расшифрованную дату, она работает хорошо, но когда я хочу использовать ее в выражении IF, она не работает:
$seller_user_id = decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY);
$seller_user_name = $_SESSION["seller_name"] ;
$login_ok = decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY);
echo "login_ok is : " .$login_ok ;
if ( $login_ok == 'ok' )
{
}
else
{
echo "Login Fail";
echo "<br> " .$login_ok ;
}
и этот выход:
login_ok is: ok Войти Fail ok
как вы видите $login_ok == 'ok
«Правда, но код говорит, что это фальшивка!
Я не знаю, в чем проблема! Это просто, но …
На http://php.net/manual/en/function.mcrypt-decrypt.php ты можешь читать:
Данные, которые будут расшифрованы с заданным шифром и режимом. Если
размер данных не n * размер блока, данные будут дополнены
‘\ 0’.
Поэтому, прежде чем сравнивать возвращаемые данные с другими строками, вы должны обрезать их, как вы можете видеть в примере ниже:
$seller_user_id = decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY);
$seller_user_name = $_SESSION["seller_name"] ;
$login_ok = rtrim(decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY), "\0\4");
echo "login_ok is : " . $login_ok . "<br>";
if ($login_ok == 'ok') {
echo "Logged in succesfully!!";
} else {
echo "Login Fail - " .$login_ok ;
}
Этот пример обрезает NULL (\ 0) и EOT (\ 4) в конце строки с помощью rtrim( ... , "\0\4");
Блочный шифр (например, Blowfish) с блочным режимом (например, ECB) работает только с открытым текстом, кратным размеру блока. Размер блока для Blowfish составляет 64 бита, но строка «ok» меньше размера блока, поэтому mcrypt автоматически добавляет открытый текст с байтами 0x00 к следующему кратному размеру блока.
Вы должны удалить это дополнение после расшифровки:
$decrypted_string = rtrim(mcrypt_decrypt(...), "\0");
Обратите внимание, что это также приведет к удалению 0x00 байтов из допустимого открытого текста, если оно заканчивается 0x00 байтов. Если вы хотите предотвратить это, вам нужно использовать надлежащие отступы для шифрования и дешифрования, такие как PKCS # 7 отступы.
Обрезать расшифрованные данные для пробелов.
Используйте функцию trim () перед использованием в условии if.
$login_ok = trim(decrypted data);
If( $login_ok )
{
your function
}