PHP двустороннее шифрование для передачи переменных через URL

ОК … в точку …

У меня есть программа для создания снимков электронной почты, которая отправляет тысячи писем — каждое с str_replace() объединить поля (поля, которые заменяются значением строки в наборе записей).

Одной из важных частей является моя способность отслеживать открытые письма, поэтому я включаю один сгенерированный на стороне сервера пиксель …

<img src="http://...trace.php?email=<<<EMAIL>>>" alt="" height="1" width="1">

str_replace() заменяет <<<EMAIL>>> с уникальным реальным адресом электронной почты.

trace.php файл читает $_GET['email'] и либо регистрирует его, либо отправляет подтверждение по электронной почте.

Моя проблема в безопасности 🙂

Я хочу использовать двустороннее шифрование, чтобы $_GET Переменная, отправленная в URL, является зашифрованной электронной почтой. Затем файл trace.php необходимо расшифровать.

Поскольку он отправляется в URL, он должен быть в формате ASCII, иначе он будет поврежден перед расшифровкой.

Я не могу использовать openssl_encrypt() & openssl_decrypt() и мне приходится работать с php 5.2.0 (не швыряйте оскорбления на меня!).

Любая помощь будет принята с благодарностью!

0

Решение

Хотя многие из полученных вами комментариев предлагают другие действительные способы решения проблемы, например, Таблица адресов электронной почты с первичными ключами. Я считаю, что лучший способ решить эту проблему — это то, что вы изначально намеревались: включая адрес электронной почты, зашифрованный в URL-адресе запроса.

Я чувствую, что этот путь лучше, потому что:

  • Вычисление адреса электронной почты не требует доступа к базе данных. Узкое место в базе данных, как правило, является крупнейшим нарушителем для запросов с высокой задержкой.
  • Шифрование означает, что один и тот же адрес электронной почты будет создавать разные пары IV / зашифрованный текст при каждом его шифровании. Таким образом, если вы отправляете несколько электронных писем в разное время (например, для двух разных маркетинговых кампаний), URL будет отличаться каждый раз. Это может не иметь никакого эффекта, но оно обеспечивает преимущество безопасности в том, что злоумышленник не может «сделать вид», что электронное письмо было открыто, просто посетив URL.

Проблема в том, что для того, чтобы этот путь был лучше, нужно сделать это Что ж. Я включил выдержку в PHP из этот репозиторий ниже. Если вы не можете использовать openssl_* затем обновите версию PHP. Не делайте, Когда-либо, использовать mcrypt_ функции. Они устарели по причине. Вам может потребоваться шестнадцатеричное кодирование вместо base64-кодирования адресов электронной почты, как это сделано в примере ниже.

<?php

define("ALGORITHM_NAME", "aes-128-gcm");
define("ALGORITHM_NONCE_SIZE", 12);
define("ALGORITHM_TAG_SIZE", 16);
define("ALGORITHM_KEY_SIZE", 16);
define("PBKDF2_NAME", "sha256");
define("PBKDF2_SALT_SIZE", 16);
define("PBKDF2_ITERATIONS", 32767);

function encryptString($plaintext, $password) {
// Generate a 128-bit salt using a CSPRNG.
$salt = random_bytes(PBKDF2_SALT_SIZE);
// Derive a key.
$key = hash_pbkdf2(PBKDF2_NAME, $password, $salt, PBKDF2_ITERATIONS, ALGORITHM_KEY_SIZE, true);
// Encrypt and prepend salt and return as base64 string.
return base64_encode($salt . encrypt($plaintext, $key));
}
function decryptString($base64CiphertextAndNonceAndSalt, $password) {
// Decode the base64.
$ciphertextAndNonceAndSalt = base64_decode($base64CiphertextAndNonceAndSalt);
// Retrieve the salt and ciphertextAndNonce.
$salt = substr($ciphertextAndNonceAndSalt, 0, PBKDF2_SALT_SIZE);
$ciphertextAndNonce = substr($ciphertextAndNonceAndSalt, PBKDF2_SALT_SIZE);
// Derive the key.
$key = hash_pbkdf2(PBKDF2_NAME, $password, $salt, PBKDF2_ITERATIONS, ALGORITHM_KEY_SIZE, true);
// Decrypt and return result.
return decrypt($ciphertextAndNonce, $key);
}
function encrypt($plaintext, $key) {
// Generate a 96-bit nonce using a CSPRNG.
$nonce = random_bytes(ALGORITHM_NONCE_SIZE);
// Encrypt and prepend nonce.
$ciphertext = openssl_encrypt($plaintext, ALGORITHM_NAME, $key, OPENSSL_RAW_DATA, $nonce, $tag);
return $nonce . $ciphertext . $tag;
}
function decrypt($ciphertextAndNonce, $key) {
// Retrieve the nonce and ciphertext.
$nonce = substr($ciphertextAndNonce, 0, ALGORITHM_NONCE_SIZE);
$ciphertext = substr($ciphertextAndNonce, ALGORITHM_NONCE_SIZE, strlen($ciphertextAndNonce) - ALGORITHM_NONCE_SIZE - ALGORITHM_TAG_SIZE);
$tag = substr($ciphertextAndNonce, strlen($ciphertextAndNonce) - ALGORITHM_TAG_SIZE);
// Decrypt and return result.
return openssl_decrypt($ciphertext, ALGORITHM_NAME, $key, OPENSSL_RAW_DATA, $nonce, $tag);
}
?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]