mcrypt和urlencoding问题

时间:2014-05-07 00:10:18

标签: php .htaccess authentication cryptography authorization

首先让我明确表示我对前端应用程序没有任何控制权(它是一个iOS应用程序而且我已经按照它的方式使用它)。使用身份验证令牌I通过类中的以下功能进行编码和解码。

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

如您所知,此算法会生成需要进行urlencoded编码的字符,因此我会在发送电汇之前对其进行编码。

我注意到前端应用程序自动对authToken进行urldecoding,然后发送回urldecoded的。

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

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

我不知道如何才能正确处理它,我的前端应用程序会对其进行编码,然后这个.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]

如果我的方法有误,你们如何处理认证呢?

编辑(示例数据):

+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)

2 个答案:

答案 0 :(得分:0)

取决于你的实现,如果在任何时候它将作为get参数传递然后是,但似乎你遇到了+符号问题,而不是尝试使用rawurlencode()和rawurldecode()

答案 1 :(得分:0)

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

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

另一方面,发送的字符串对我来说看起来像64,所以也许你根本不需要64位编码。