PHP中的PHP加密和解密参数URL

时间:2017-11-08 19:18:54

标签: php url encryption encryption-symmetric

我正在尝试在GET请求中将第1页的下载URL传递给第2页。

第1页通过数据库获取原始URL,然后加密URL并使其在网站上可用。当它通过URL时,第2页解密URL并下载文件。

网址目前如下:

  

https://example.com/download.php?dl=x6%1A%D8j%C4%D2%9Cx%8FA%8B%29%23Y%D9%D6%B4%DE8%18%2C%7B%F4%86l%B0%0A+%D3%B1%01I%CFo%FF%BA%9C%22%A1%08%11%DB%12%282%DEi%B5%CA%14K%FF%21%CB%F3%9D%3C9f%3C%09%FA9%BB%BD%C9%B2%275%F0%06%A2%80%08h%A7f%8C%87%28%A4%A5%99%A9%A9%FA%D6f%C5%CA%9B%81.%92%CD%89%FA3%5C%0C%F0%ED%F6%D9%1E%B9%D0%B1%CFSA%F4%95k%1EZ%D1%3A%D4H%1D%93%40%087%92%88%C3%A5p%C7WH%FA%CF%9D%BAKd%A0%9A%D7a6%80%5Ex%A5%87%07AK%D7%5BQ%10%98%07%7E%82%9A%BA9%25%D5%EA%03%FD%C2%9A%22%8FBW%94k%D8T%93%F5%E3%D7-

它包含很多%%%,因为它是urlencoded,是否有办法更改此设置以减少URL的长度并使其看起来不那么混乱,但是现在保持安全吗? /强>

希望有人可以帮助我。

这是加密和解密脚本:

define("ENCRYPTION_KEY", "ducksandpizza");

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 urlencode($encrypted_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 = urldecode($encrypted_string);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);

    return $decrypted_string;
}

//$encrypted = encrypt($_GET['dl'], ENCRYPTION_KEY);
$decrypted = decrypt($_GET['dl'], ENCRYPTION_KEY);

//echo 'encrypted: ' . $encrypted . '<br>';
echo 'decrypted: ' . $decrypted . '<br>';

2 个答案:

答案 0 :(得分:0)

对未加密的数据使用某种类型的压缩,例如gzcompress(),然后将其传递给加密方法,并将其输出传递给base64_encode。 Base64编码仍会增加整体大小,但不会像url编码那样多。

答案 1 :(得分:-1)

虽然使用base64_encode()并不一定是错误的想法,但没有人提到stock base64编码不是URL安全的,因为它使用了字符在URL语法中很重要。

但是,有一个是安全的变体用于编码JWT令牌:

function base64url_encode($bin) {
    return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($bin));
}

function base64url_decode($str) {
    return base64_decode(str_replace(['-', '_'], ['+', '/'], $str));
}

您还应该记住,GET请求受长度限制的约束,这些限制因HTTP服务器实现和语言而异。您可能希望使用评论中建议的gzcompress()之类的内容,但更有可能的是,您应该在POST中传递此数据。