ОК … в точку …
У меня есть программа для создания снимков электронной почты, которая отправляет тысячи писем — каждое с 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 (не швыряйте оскорбления на меня!).
Любая помощь будет принята с благодарностью!
Хотя многие из полученных вами комментариев предлагают другие действительные способы решения проблемы, например, Таблица адресов электронной почты с первичными ключами. Я считаю, что лучший способ решить эту проблему — это то, что вы изначально намеревались: включая адрес электронной почты, зашифрованный в 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);
}
?>
Других решений пока нет …