Php URL参数中的加密值(mcrypt_encrypt)在请求时会生成不同的结果。如何处理这种情况?

Php URL参数中的加密值(mcrypt_encrypt)在请求时会生成不同的结果。如何处理这种情况?,php,mysql,optimization,Php,Mysql,Optimization,我使用以下函数来加密字符串($str),使用密钥($key)来生成唯一密钥 示例代码: <?php $key = "####"; $str = "123456789"; $encrypted_key = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key)))); echo $encrypted_key; // 3rfmDKb/Ig5FuUnk

我使用以下函数来加密字符串($str),使用密钥($key)来生成唯一密钥

示例代码:

<?php

$key = "####";
$str = "123456789";

$encrypted_key = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))));

echo $encrypted_key; // 3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw+6WAns=
?>
但当通过URL请求时,它会将“+”解码为“空格”

代码:

www.example.com/index.php?encrypted_key=3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw+6WAns=
echo $encrypted_key = $_REQUEST['encrypted_key'];

// 3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw 6WAns=
此转换将进一步影响数据库检查:

“3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw 6WAns=”与“3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw+6WAns=”相对

此外,我还担心将这些加密值存储到索引的MySQL DB列中


这里应该采用什么样的最佳实践?任何建议都将不胜感激。

此答案仅针对表示,而不是密码的可能错误使用

当您构建具有特殊表示规则(如数据库查询、URL中的路径、HTML代码、JS代码等)的对象时,您必须确保对值执行适当的编码,以便它们能够在不造成损害的情况下进行往返

对于数据库查询参数,不要使用字符串连接。使用准备好的语句和占位符


对于URL,请使用适当的URL编码函数或URL生成器来构造URL,不要盲目地连接字符串。

首先,将加密值用作唯一ID或条件字段不是一个好主意,因为它们会因相同的值而改变。这在加密技术中很常见。如果加密算法不改变同一条目的结果,则不是一个好的加密

第二,我在处理加密和URL时遇到了同样的问题,在我的例子中,a制定了自己的加密算法,只使用URL的有效字符


实现加密并不困难:我使用了ASCII码、一个简单的密钥、一个简单的数学函数等等。为了解密,我“反转”了数学函数。

事实上,更一般地说:除非字符串只包含非结构化文本,否则使用API生成它们,而不是串联。这适用于SQL、URL、文件名、JSON、XML、HTML和许多其他类型的结构化文本。不这样做会在以后解释结构时引发安全问题。可能有用吗?