Мне нужно передать строку GET в электронное письмо, чтобы пользователь мог получить конкретную информацию о бронировании. i.e./bookingconformation.php?bookingID=123.Понимание шифрования с base64 и mcrypt
Я пытаюсь зашифровать bookingID с base64 (редактировать и Mcrypt) (в надежде, что это будет почти невозможно угадать и получить доступ к другим пользователям бронирование детали (хотя детали бронирования на самом деле не слишком чувствительны!)). Это значит, что только запрошенный пользователь может получить доступ к конформе бронирования.
Я использую код, найденный в основном здесь (stackOverflow), так как я далек от специалиста по шифрованию !!
У меня есть несколько вопросов. код я использую ниже и ниже это список вопросов, я имею
/**
* a basic encryption for things like IDs, so links can be created and emailed to i.e booking details
* @param int/str $x what is to be encrypted
* @ENCRYPTION_KET str the encyption key
* @return encrypted string
*/
public static function basicEncrypt($x, $ENCRYPTION_KET) {
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $x, MCRYPT_MODE_CBC, $iv);
$ciphertext = $iv . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
$encrypted_x = urlencode($ciphertext_base64);
return $encrypted_x;
}
/**
* a basic de-cryption for things like IDs, so links can be created and emailed to i.e booking details
* @param str $x what is to be de-crypted
* @ENCRYPTION_KET str the encyption key
* @return decrypted string
*/
public static function basicDecrypt($x, $ENCRYPTION_KET) {
$x = urldecode($x);
$ciphertext_dec = base64_decode($x);
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
$de_crypted_x = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
return $de_crypted_x;
}
Выпуск 1: использованием basicEncrypt() дает другую строку шифрования, каждый раз, когда я его использовать (например, для того же bookingID от 123). Пока он расшифровывается до одного и того же, не имеет значения, является ли строка шифрования разной. Если кто-нибудь может сообщить мне, если это каждый раз будет возвращать другую строку, и я также был бы благодарен, если можно объяснить (легко понять) объяснение, почему это так?
Выпуск 2: Приведенный выше код работает большую часть времени .... (возможно, 80%), но в других случаях он не расшифровывает к правильному ответу ... я не понимаю, почему :-(если. кто-нибудь может, дайте мне знать, что я делаю неправильно, так что он работает на 100% времени, я был бы очень благодарен
выпуск 3: (возможный выпуск) я использую UrlEncode() и urldecode(). Я прочитал лоты на stackOverflow и не могу разобраться, если я должен использовать это или нет! Я подозреваю, что проблема 2 может быть вызвана этим, но не может видеть, как правильно выработать правильный способ это и безопасный URL. Я попытался заменить UrlEncode с чем-то подобным ниже (находится здесь), но это потом приводит к выше работе 0% время
function base64_url_encode($input) {
return strtr($input, '+/=', '-_,');
}
function base64_url_decode($input) {
return strtr($input, '-_,', '+/=');
}
Также метод я использую, чтобы позволить пользователь, чтобы посмотреть их данные о бронировании. ОК/желательно? (как уже упоминалось, данные не очень чувствительны, они включают только имя пользователя, бронирование REF и то, что было забронировано. ID должен отображаться, когда пользователь появляется для бронирования (гостиницы).
Любая помощь, позволяющая мне понять, что я делаю (и шифрование) немного лучше, ценится или даже более ценится, если кто-то может указать (чтобы я мог исправить) ошибки в моем методе были бы замечательными! !
Спасибо за глядя на это :-) Форд
@CharlotteDunois basee64_decode не «расшифровывает» (как вы знаете) ... он декодирует. Ford: issue1 не проблема .. случайный «вектор инициализации» используется каждый раз ... в результате получается другой криптотекст –
@BradKent и другие пользователи, теперь я вижу, что это такое ... просто, но я не сделал назовите его до тех пор, пока не будет указано :-) – Ford
Вы можете сделать вашу жизнь намного проще, если вы использовали [defuse/php-encryption] (https://github.com/defuse/php-encryption). –