我需要通过URL传递一些加密值。有没有办法避免加密后获得的值中的某些字符,例如斜杠 (/)?因为在编码器点火器中,斜杠等字符用于分隔 URL 中的参数。请注意,我不希望有任何建议不要在 URL :)<</p>
后使用 PHP urlencode
函数:http://php.net/manual/en/function.urlencode.php 并在处理 GET 数据的脚本中使用urldecode
。
class MY_Encrypt extends CI_Encrypt
{
function encode($string, $key="", $url_safe=TRUE)
{
$ret = parent::encode($string, $key);
if ($url_safe)
{
$ret = strtr(
$ret,
array(
'+' => '.',
'=' => '-',
'/' => '~'
)
);
}
return $ret;
}
function decode($string, $key="")
{
$string = strtr(
$string,
array(
'.' => '+',
'-' => '=',
'~' => '/'
)
);
return parent::decode($string, $key);
}
}
-
$key = $this->config->item('encryption_key');
$outboundlink = urlencode( $this->encrypt->encode($segment, $key, TRUE) );
$inboundlink = rawurldecode( $this->encrypt->decode( $segment, $key) );
一个想法是仅使用 0-9 和 a-f 以及可选的 x 将加密字符串表示为十六进制。
但我建议您使用TLS(更好的SSL)来保护数据,因为现在您可能使用JS加密数据,以便攻击者可以看到密钥。
不要调用当前方案的安全性或加密,而只是混淆。
你想要的
不是加密(这意味着安全性),而是一种编码。在实践中,您的选择基本上是:
- urlencode(如果您希望字符串稍微清晰易读,请使用此选项。这也将为您提供比其他两个选项更短的字符串)
- base64(如果您不希望字符串清晰易读并且还想节省字符串中的空间,请使用此选项)
- 十六进制(如果您不希望字符串清晰易读并且不关心字符串长度,请使用此选项)
我不会选择十六进制。决定是否希望字符串清晰易读,并首先选择两者之一。