如何编码/加密要通过URL参数传输的秘密数据?

时间:2010-08-13 03:17:15

标签: php encryption

以下是故事:

我必须将一些机密信息从一个脚本传递到另一个脚本。在第一个脚本中,我需要先加密数据然后必须将加密数据附加到GET请求中并将其发送到另一个脚本。 URL如下所示:

http://mydomain.com/mysecondscript.php?secret={encrypted stuff}

我目前的加密方法基于base64。这种方法的问题是,如果我有很多要加密的东西,加密的结果可能会变得很长。如果它超过255个字符左右,则第二个脚本将无法解密它,因为字符串将被切断。

所以我正在寻找一种更好的加密方法,可以控制加密结果的长度。

5 个答案:

答案 0 :(得分:16)

危险!

Base64 NOT 是一种加密形式,但是编码。 Base64编码的字符串易于识别,并且易于解码。 Base64用于对数据进行编码,以便可以跨非二进制安全介质(例如URL和电子邮件)安全地传输数据,但它们不会隐藏数据本身。

您需要做的是使用AES加密字符串(请参阅PHP的mcrypt),然后对其进行base64编码。这当然不会解决您的长度问题。问题很模糊,但你能做的是:

  • 使用POST代替GET。
  • 将数据存储在两个脚本都可以访问的数据库或文件中。然后只生成一种标识符并使​​用URL发送它。接收脚本可以使用此标识符来检索数据。作为额外的奖励,您不必使用URL发送分类数据。

编辑:现在我更仔细地阅读了您的问题,似乎两个脚本都位于同一台服务器上。在这种情况下,没有理由通过HTTP传递此数据。

答案 1 :(得分:2)

无论您的加密方案有多安全,您仍然需要对结果进行base64或URL编码,您发现该结果可能超过255个字符。您可以做的最好的事情是压缩数据,然后对其进行加密,然后对其进行编码。它仍然可能会失败。您需要找到GET的替代方案。

答案 2 :(得分:0)

为什么必须在URL中传输?将其保存到磁盘,将其放入数据库,将其添加到消息传递队列...

您可以在URL中使用不透明令牌来识别您正在谈论的内容,然后通过查询您选择的任何存储机制将该令牌转回到另一端的有用内容。

答案 3 :(得分:0)

如果这是敏感信息,则不应使用base64,因为它可以轻松解码。如果您希望对信息进行安全加密,请使用PHP Mcrypt(link)。更安全,可以支持更长字符串的加密。最重要的是,您设置了自己的密钥,没有该密钥就无法解密。它需要更多的工作,但它将是安全的。此外,如果以这种方式传递多个变量,可以将它们设置为数组,序列化并加密数组,通过GET传递数组,然后解密/反序列化。就这么简单。最后一件事,还有一些课程会让Mcrypt更容易使用。可能想谷歌找一个,它会让你的生活更轻松。

答案 4 :(得分:0)

您可以使用MD5创建id的哈希值,以便得到类似的内容:

<强> http://www.demo.com/displaycommittees.php?id=81dc9bdb52d04dc20036dbd8313ed055

在您的数据库查询中,您可以在users表上执行select,包括WHERE语句,该语句也会对id列进行哈希处理:

WHERE MD5(id)= $ _GET [id]

这很好用,我总是应用这个算法。例如,假设加密ID的实际值 23 ,如果您尝试将 23 代替加密(哈希)代码,它将无法工作(不会产生任何结果)显示)。

注意:对于需要解决方案的人来说,原因最为人所知,因此对于需要解决方案的人来说,问题“为什么”可能不会出现。他们只是要求一个解决方案,如果它适合他们,那很好。但是对于交易申请(例如现金交易或交易引脚),请避免通过URL传递敏感信息,因为它很容易被破解。