Php mcrypt和url编码问题

Php mcrypt和url编码问题,php,.htaccess,authentication,cryptography,authorization,Php,.htaccess,Authentication,Cryptography,Authorization,首先,让我澄清一下,我对使用身份验证令牌的前端应用程序(这是一个iOS应用程序,我必须按照它的方式生活)没有任何控制权,我正在通过类中的以下函数对其进行编码和解码 我的应用程序返回基于用户名/密码的authToken,然后前端应用程序继续通过此authToken与我通信,我每次解码此authToken以查找用户信息 正如您所知,这个算法生成需要url编码的字符,所以我在发送之前对它们进行url编码 我注意到前端应用程序会自动对authToken进行URL解码,然后发送一个URL解码后的authT

首先,让我澄清一下,我对使用身份验证令牌的前端应用程序(这是一个iOS应用程序,我必须按照它的方式生活)没有任何控制权,我正在通过类中的以下函数对其进行编码和解码

我的应用程序返回基于用户名/密码的authToken,然后前端应用程序继续通过此authToken与我通信,我每次解码此authToken以查找用户信息

正如您所知,这个算法生成需要url编码的字符,所以我在发送之前对它们进行url编码

我注意到前端应用程序会自动对authToken进行URL解码,然后发送一个URL解码后的authToken

但是这里的事情变得复杂了,我在服务器上也有.htaccess,我相信它会对url进行编码或解码,不确定

最终的结果是,当令牌到达应用程序时,它与我发送的内容不同

我不确定如何才能正确处理它,我已经让前端应用程序对它进行了URL解码,然后这个.htaccess正在做一些事情,最终结果是我没有原始令牌

public static function encrypt($data, $secret) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $key = pack('H*', $secret);
    return base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv));
}

public static function decrypt($data, $secret) {
    $data = base64_decode($data);
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = substr($data, 0, $iv_size);
    $data = substr($data, $iv_size);
    $key = pack('H*', $secret);
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv), chr(0));
}
在我的视图层中,由上述函数生成的authToken

echo urlencode($authToken)
.htaccess文件

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
如果我的方法是错误的,你们是如何处理身份验证的?

编辑(示例数据):


取决于您的实现,如果在任何时候它都将作为get参数传递,则是,但您似乎对+符号有问题,而不是尝试使用rawurlencode()和rawurldecode()

,除非您在显示文本时记录错误或执行某种解码,在我看来,你的iOS应用程序并没有真正进行URL编码

不应该有纯+符号。如果是这种情况,则在URL编码后,这些字符应替换为%XX。空格不是base 64的一部分,因此不应将空格转换为+符号


另一方面,发送的字符串对我来说像是base 64,所以你可能根本不需要base 64编码。

你的.htaccess文件所做的就是将解锁从:
example.com/some/thing
重写为
example.com/index.php?uri=/some/thing
理解这一点,但我相信它也会影响get和post变量,不???不应该影响帖子。获取可能会稍有更改,因为它将获取的第一个分隔符是?它不会被视为一个,因为您已经在get参数中。您可以尝试将其更改为
RewriteRule^(+)?(.*)$index.php?uri=$1&$2[QSA,L]
,这应该可以解决这个问题。好的,然后,在echo上进行urlencoding,然后在回读时进行urldecode,这是必要的吗?问题是,如果请求通过get发送,空格将变成+号,但如果它通过post发送,则不会。请确认urldecode()将它们更改为空格。但是,如果您看到我的示例数据中的第一个条目,iOS应用程序将我的加号更改为空格,请查看具有相同行为的其他示例数据条目。如果加号更改为空格,则它正在解码尚未编码的数据。编码:空格变成+,解码:加号变成空格。
+zrOchaEg6X9oXMsSz2yq7jcxGLsIsh5XpgUEEhqLuoGT6nqNcpwevPXCUCPiUQ9 (my app sent down this)
 zrOchaEg6X9oXMsSz2yq7jcxGLsIsh5XpgUEEhqLuoGT6nqNcpwevPXCUCPiUQ9 (front end app sent me back this)

EzfudmhVDKhfiZU1rN+h5vgdq+JsHFBI6suio2wwvS3415UvHcqaNkj6RCcPNcrN (my app sent this)
EzfudmhVDKhfiZU1rN h5vgdq JsHFBI6suio2wwvS3415UvHcqaNkj6RCcPNcrN (front end app sent this)

p45ho0s2qWBxzCWsOohSL5u+noxUdpkjfjVy/wib58Sx2lqXIfco3uHLpaiDLy58 (my app sent this)
p45ho0s2qWBxzCWsOohSL5u noxUdpkjfjVy/wib58Sx2lqXIfco3uHLpaiDLy58 (front end app sent me back this)

NBEwy2WAInAgqC54WR6kNHVVpTObN1x1Wbu9JRD/UTCuMLbtHAomHFWDX8olFrC9 (my app sent this)
NBEwy2WAInAgqC54WR6kNHVVpTObN1x1Wbu9JRD/UTCuMLbtHAomHFWDX8olFrC9 (front end app sent me back this)