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

时间:2015-08-07 08:26:57

标签: php mysql optimization

我使用以下函数使用($ 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数据库列中。

这里采用的最佳做法是什么?任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

这个答案只涉及表示,而不是加密的可能错误使用。

当您构建具有特殊表示规则的对象(如数据库查询,URL中的路径,HTML代码,JS代码等)时,您必须确保对值进行适当的编码,以便它们可以无损地往返

对于数据库查询参数,请勿使用字符串连接。使用预先准备好的陈述和占位符。

对于URL,使用正确的URL编码功能或URL构建器来构建您的URL,不要盲目地连接字符串。

答案 1 :(得分:0)

首先,将加密值用作唯一ID或条件字段不是一个好主意,因为它们将更改为相同的值。这在加密方面非常普遍。如果加密算法不会更改同一条目的结果,则它不是一个好的加密。

其次,我在处理加密和URL方面遇到了同样的问题,在我的情况下,我使用了自己的加密算法,只使用了有效的URL字符。

实现加密并不困难:我使用了ASCII码,一个简单的键,一个简单的数学函数,仅此而已。为了解密,我反对&#34;数学函数。