【问题标题】:php encode string and vice-versaphp编码字符串,反之亦然
【发布时间】:2012-06-13 06:48:23
【问题描述】:

我有一些实体(对象),每个实体都有一个 id(唯一)和一个名称。
当我想显示其中一个时,我有一个类似 www.domain.com/view/key:xxx 的网址。
键只是用base64_encode编码的实体的id,所以从url中不能直接看出id是什么。

我现在要做的(由于项目规范)是让密钥只包含数字和字母(base64_encode 在 url 编码后提供类似 eyJpZCI6IjM2In0=eyJpZCI6IjM2In0%3D 的结果)。

有没有一个简单的替代方案?这不是一个高安全性问题 - 可以通过多种方式显示 id - 我只需要一个仅包含由实体 ID 生成的字母和数字的密钥(可能与其名称相结合)解码给我回ID。

我发现的所有不同的编码方法也可以包含特殊字符。
这里有什么帮助吗?
在此先感谢

【问题讨论】:

    标签: php encryption encode


    【解决方案1】:

    这个答案并没有真正应用加密,但由于您的问题也被标记为编码......

    从 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, '-_,', '+/='));
    }
    

    【讨论】:

    • @dynamic 当然可以,但您始终可以使用 pack('H*', $str); 作为 php 的替代品
    • 其他人的 php.net 是否已关闭?我正在尝试查看 hex2bin 函数。是的,杰克,谢谢。
    • @dynamic 是的,我一直在使用us2.php.net :(
    • 对我来说也是如此......不过,您可以使用 de.php.net 之类的镜像(即使您不是来自德国 :-))
    【解决方案2】:

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

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

    【讨论】:

    • 不能只去掉'=',它可能有多个,然后我将无法知道那里有多少'='......
    • @CrisDeBlonde:如果您将 ID 设置为固定长度,例如用前导零填充左侧的 ID,那么您将始终知道最后会有多少个“=”,您可以删除它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2012-03-06
    • 2015-12-09
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多