API加密网址,并且在返回null时无法使用mcrypt进行解密

时间:2015-07-14 23:35:00

标签: php encryption

我正在尝试通过加密的URL发送,然后在另一端解码它。现在我调用的调用被传递,但我的解密返回null。

这是我的一些代码。

$this->_app_url . '?key=' . $this->_api_key . '&request=' .base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->_api_key, json_encode($url), MCRYPT_MODE_ECB));

网址只是一个标准网址,密钥是32位字符串,因此您可以将其想象成任何东西。 $ url变量是要发送的东西数组。因此,当我解密时,我完全拥有该数组。

所以在另一端我试图解码:

$key = $_REQUEST["key"];
$encrypted = $_REQUEST["request"];

$decrypted = json_decode(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encrypted), MCRYPT_MODE_ECB)));

这只是返回NULL,我可以回应键和请求,我得到了我所期待的但我无法解密它。

1 个答案:

答案 0 :(得分:0)

这个问题被问了很多,用不同的单词选择(这使得很难说“只搜索它!”)。这个事实促使了一篇名为The Comprehensive Guide to URL Parameter Encryption in PHP 的博客文章。

人们在这里想要做什么

Some encryption function is used to deterministically retrieve the ID

人们应该怎么做

Use a separate column

说明

通常,人们希望使用 short 随机查找的URL。这并没有太多空间来encrypt then authenticate您要混淆的数据库记录ID。这样做将要求URL的最小长度为32个字节(对于HMAC-SHA256),以base64编码时为44个字符。

一种更简单的策略是生成一个随机字符串(请参见random_compat(有关random_bytes()的PHP5实现和random_int()的生成这些字符串的PHP5)并引用该列。

如果必须加密数据(非常不推荐),请不要使用本地设计(和don't use mcrypt either!)。使用trustworthy library instead