我使用以下函数使用键($ key)加密字符串($ str)来制作唯一键。
示例代码:
<?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=
?>
该函数返回包含特殊字符(包括'+')的值。我将这些值作为唯一ID存储在数据库中。
但是在某些情况下,我需要通过URL传递$ encrypted_key。即;与RESFful Web服务一起使用
示例网址
www.example.com/index.php?encrypted_key=3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw+6WAns=
但是,当通过URL请求时,会将“+”解码为“空格”
代码:
echo $encrypted_key = $_REQUEST['encrypted_key'];
// 3rfmDKb/Ig5FuUnkY8fiHpqA3FD4PflXMksJw 6WAns=
此转换进一步影响了数据库检查:
'3rfmDKb / Ig5FuUnkY8fiHpqA3FD4PflXMksJw 6WAns ='对'3rfmDKb / Ig5FuUnkY8fiHpqA3FD4PflXMksJw + 6WAns ='
此外,我担心将这些加密值存储到索引的MySQL数据库列中。
这里采用的最佳做法是什么?任何建议都将受到高度赞赏。
答案 0 :(得分:2)
这个答案只涉及表示,而不是加密的可能错误使用。
当您构建具有特殊表示规则的对象(如数据库查询,URL中的路径,HTML代码,JS代码等)时,您必须确保对值进行适当的编码,以便它们可以无损地往返
对于数据库查询参数,请勿使用字符串连接。使用预先准备好的陈述和占位符。
对于URL,使用正确的URL编码功能或URL构建器来构建您的URL,不要盲目地连接字符串。
答案 1 :(得分:0)
首先,将加密值用作唯一ID或条件字段不是一个好主意,因为它们将更改为相同的值。这在加密方面非常普遍。如果加密算法不会更改同一条目的结果,则它不是一个好的加密。
其次,我在处理加密和URL方面遇到了同样的问题,在我的情况下,我使用了自己的加密算法,只使用了有效的URL字符。
实现加密并不困难:我使用了ASCII码,一个简单的键,一个简单的数学函数,仅此而已。为了解密,我反对&#34;数学函数。