PHP ЕСЛИ не работает после шифрования и дешифрования строки

1

Я хочу, чтобы encypt все мои 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);

теперь, когда я хочу показать Decrypted date, он работает хорошо, но когда я хочу использовать его в выражении 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: ok Войдите в Fail ok

как вы видите $login_ok == 'ok ', это правда, но код говорит, что это ошибки! Я не знаю, в чем проблема! Это просто, но...

  • 1
    замыкающие пробелы? Используйте var_dump() вместо echo для отладки, потому что он предоставляет более полезную информацию, такую как фактическая длина строковых значений
  • 0
    Я надеюсь, что вы на самом деле не используете Blowfish в режиме ECB с IV, созданным MCRYPT_RAND . Посмотрите на это сообщение в блоге cryptofails.com/post/75204435608/… и подумайте об использовании этой библиотеки: github.com/defuse/php-encryption
Теги:
encryption
comparison
padding
mcrypt

3 ответа

2
Лучший ответ

В http://php.net/manual/en/function.mcrypt-decrypt.php вы можете прочитать:

Данные, которые будут дешифрованы с данным шифром и режимом. Если размер данных не является n * blockize, данные будут дополняться "\ 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");

2

Блочный шифр (например, Blowfish) с блочным режимом (например, ECB) работает только в открытом тексте, который кратен размеру блока. Размер блока для Blowfish составляет 64 бит, но строка "ok" меньше размера блока, поэтому mcrypt автоматически накладывает открытый текст на 0x00 байт на следующий кратный размер блока.

После дешифрования вам необходимо удалить это дополнение:

$decrypted_string = rtrim(mcrypt_decrypt(...), "\0");

Обратите внимание, что это также удалит 0x00 байт из законного открытого текста, если это закончится на 0x00 байт. Если вы хотите это предотвратить, вам нужно использовать правильное заполнение для шифрования и дешифрования, например, дополнение PKCS # 7.

2

Обрезайте дешифрованные данные для пробелов. Используйте функцию trim() перед использованием в условии if.

$login_ok = trim(decrypted data);

If( $login_ok ) 

{ 

your function 

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню