【问题标题】:passing openssl_encrypt encrypted data as query string将 openssl_encrypt 加密数据作为查询字符串传递
【发布时间】:2016-05-01 02:31:19
【问题描述】:

我正在使用 openssl_encrypt 和 openssl_decrypt 函数来加密和解密作为查询字符串传递的 id。但在某些情况下,加密的查询字符串包含“+”字符。这导致 openssl_decrypt 函数出现问题,我收到以下警告。

$x = openssl_encrypt ('3', 'AES-256-CBC', $password,0, $iv);
echo openssl_decrypt ($x, 'AES-256-CBC', $password,0, $iv);

警告:openssl_decrypt():base64 解码输入失败

请让我知道是否有任何其他方法可以在没有此“+”字符的情况下加密数据。另外我想将加密id的字符长度限制在100以下。

【问题讨论】:

  • 如果您使用的是 rdbms,您可能想要使用 CRC32 吗?无需加密解密,只需传递您的 id crc32 编码并与 crc32 匹配,或者在选择使用 crc32(id) 获取时,但此建议适用于您的目标是从公共隐藏您的真实 id。

标签: php encryption


【解决方案1】:

查询字符串中的某些字符必须经过 URL 编码,因此查询字符串在使用前必须未编码。您可能看到的是空格字符被编码为“+”。

参见URL encoding - 维基百科

HTML 5 为使用“get”方法向 Web 服务器提交 HTML 表单指定了以下转换:[1]

无法转换为正确字符集的字符被替换为 HTML 数字字符引用[11]

  • SPACE 编码为“+”或“%20”
  • 字母(A–Z 和 a–z)、数字 (0–9) 和字符 '*'、'-'、'。和“_”保持原样
  • 所有其他字符都编码为 %HH 十六进制表示,任何非 ASCII 字符首先编码为 UTF-8(或其他指定编码)

【讨论】:

  • 什么是quarry?可以吃吗? :-)
  • @CharlotteDunois 不,它在你的头上摆动。
【解决方案2】:

我正在使用 openssl_encrypt 和 openssl_decrypt 函数来加密和解密作为查询字符串传递的 id。

我可以给你介绍a better idea than encrypting IDs吗?

$x = openssl_encrypt ('3', 'AES-256-CBC', $password,0, $iv);
echo openssl_decrypt ($x, 'AES-256-CBC', $password,0, $iv);

两件事:

  1. Authenticate your ciphertext
  2. 使用OPENSSL_RAW_DATAurlencode()

【讨论】:

    【解决方案3】:

    1) 使用 OPENSSL_RAW_DATA
    2) iv (A non-NULL Initialization Vector) 应该是一些字母数字。
    例如
    $iv="0123456789abcdef";

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多