PHP编码字符串及其反向操作

5
我有一些实体(对象),每个实体都有一个唯一的ID和一个名称。
当我想要显示其中之一时,我会得到一个URL,例如www.domain.com/view/key:xxx。
这里的键只是实体的ID使用base64_encode编码后的结果,因此从URL中并不能直接看出ID。
现在我正试图做的事情(由于项目规范),是使密钥仅包含数字和字母(base64_encode提供了类似eyJpZCI6IjM2In0=eyJpZCI6IjM2In0%3D的结果,经过URL编码后)。
这个问题有简单的替代方法吗?这不是一个高安全问题 - ID可以通过许多方式被获取 - 我只需要一个只包含字母和数字的密钥,它由实体ID(也可能与其名称结合)生成,可以解码以给我ID。
我发现的所有不同编码方法都可能包含特殊字符。
有什么帮助吗?
提前谢谢
2个回答

8

这个答案并不涉及加密,但是因为你的问题也标记了编码...

自从PHP 5以后,你可以使用bin2hex函数:

$s = base64_decode('eyJpZCI6IjM2In0=');
echo bin2hex($s);

输出:

7b226964223a223336227d

解码:

$s = hex2bin($data);

或者:

$s = pack('H*', $data);

顺便提一下,如果id很敏感,您可能想考虑防篡改而不是完全加密。
忘了提及如何使base64编码的数据URL安全:
function base64_url_encode($input)
{
    return strtr(base64_encode($input), '+/=', '-_,');
}

function base64_url_decode($input)
{
    return base64_decode(strtr($input, '-_,', '+/='));
}

1
@dynamic 当然可以,但是在 PHP < 5.3 版本中,您始终可以使用 pack('H*', $str); 作为替代方案。 - Ja͢ck
有其他人无法访问php.net吗?我正在尝试查看hex2bin函数。还有,谢谢Jack。 - Steve
@dynamic 是的,我目前一直在使用 us2.php.net :( - Ja͢ck
对我来说也是一样的... 虽然你不在德国,但是你可以使用像 http://de.php.net 这样的镜像。 - klaustopher

0

有许多PHP编码/解码函数。你可以在这里这里找到很多。

或者,只需去掉base64_encode末尾的=,并将其添加到PHP代码中的base64_decode中以查找ID。


不能简单地去掉'=',因为它可能有多个,那么我就无法知道有多少个'='了... - CdB
@CrisDeBlonde:如果您将您的ID设置为固定长度,例如在左侧填充前导零,则您始终会知道末尾有多少个'=',并且可以将它们删除。 - President James K. Polk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接