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


Я пытаюсь отправить зашифрованные данные по URL-адресу на другой сайт (используя file_get_contents("anotherUrl.php?hash=$encryptedString"). Проблема в том, что иногда шифрование содержит некоторые специальные символы, такие как +, и это приводит к сбою расшифровки.

Вот мои методы шифрования/дешифрования:

public function encrypt($string, $key)
{
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}

public function decrypt($encrypted, $key)
{
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}

Вот пример зашифрованной строки, которая содержит +, и я предполагаю, что это приводит к сбою расшифровки.

oWCrVPaS+5GbxcQFc0fulUk/zRAkDD60av4zlPiWskE=

Есть идеи, как мне это решить? Я пытался сделать urlencode() и urldecode() в хэше, однако это также, по-видимому, приводит к нарушению шифрования. Есть ли способ изменить алгоритм шифрования, чтобы он возвращал только безопасные символы URL?

Author: Click Upvote, 2013-11-16

3 answers

Взгляните на эту тему:

Передача строк в кодировке base64 в URL

По сути, вы хотите urlencode() перед отправкой строки, однако вы НЕ хотите urldecode() на другом конце.

 16
Author: jszobody, 2017-05-23 12:32:26

Для решения этой проблемы я теперь использую следующее (после 3 часов боли), и это отлично работает.

Не стесняйтесь копировать и вставлять

function encrypt($pure_string) {
    $dirty = array("+", "/", "=");
    $clean = array("_PLUS_", "_SLASH_", "_EQUALS_");
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $_SESSION['iv'] = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $_SESSION['encryption-key'], utf8_encode($pure_string), MCRYPT_MODE_ECB, $_SESSION['iv']);
    $encrypted_string = base64_encode($encrypted_string);
    return str_replace($dirty, $clean, $encrypted_string);
}

function decrypt($encrypted_string) { 
    $dirty = array("+", "/", "=");
    $clean = array("_PLUS_", "_SLASH_", "_EQUALS_");

    $string = base64_decode(str_replace($clean, $dirty, $encrypted_string));

    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $_SESSION['encryption-key'],$string, MCRYPT_MODE_ECB, $_SESSION['iv']);
    return $decrypted_string;
}
 5
Author: Dan Green-Leipciger, 2014-04-28 17:59:43

Вместо использования Base64 для кодирования ваших данных вы также можете использовать Base32 (RFC 4648), который безопасен для URL, поскольку в нем используются только буквы A-Z (без учета регистра) и цифры 2-7. Уже существует библиотека PHP для кодирования/декодирования. Обратите внимание, что Base32 занимает на ~20% больше места, чем Base64.

Вы также можете использовать URLCRYPT, который является удобной библиотекой, помогающей вам с шифрованием и кодировкой Base32.

 2
Author: rkallensee, 2014-10-28 16:10:19