php - 有没有办法创建可逆的不透明 UUID?

标签 php

请求

我们需要一个仅限 php 的系统,以可逆的方式将 filepath/filename.ext 映射到 UUID。

示例

例如:

maps/shop1.jpg ->  342abfec-31fdfg-23131

用户只能从以下位置访问此 map

loader.php?token=342abfec-31fdfg-23131

loader.php 必须能够“反​​转”UUID,以便脚本可以发送 maps/show1.jpg

目标

此阶段的主要目标不是保护内容访问。

我们目前的目标只是添加“不透明度”级别,以避免用户只需更改 URL 即可打开 shop2.jpg

问题

目前我们无法将 UUID<-->文件映射保存到数据库或类似数据库中。

因此,我请求“动态”创建与 filepath/filename.txt 相对应的 UUID,并且此 UUID必须 是可逆的,以便 PHP 脚本可以“解码”它,并且提供相应的文件。

问题

是否已经存在可逆字符串到 UUID 算法?

最佳答案

听起来您希望很难猜测 URL 或发现其中的模式。 another answer中base64编码的建议是一个很好的方法,但是相似的输入仍然会导致相似的输出,所以它可能并不理想:

maps/shop1.jpg: bWFwcy9zaG9wMS5qcGc
maps/shop2.jpg: bWFwcy9zaG9wMi5qcGc
maps/shop3.jpg: bWFwcy9zaG9wMy5qcGc
maps/shop4.jpg: bWFwcy9zaG9wNC5qcGc
maps/shop5.jpg: bWFwcy9zaG9wNS5qcGc

为了避免这种情况,您可以将字符串与随机盐(或“nonce”)进行异或,并将盐包含在 URL 中以对其进行解码,例如:

function base64_url_encode($input)
{
    return strtr(base64_encode($input), '+/=', '._-');
}

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

function obfuscate($input)
{
    $salt = random_bytes(strlen($input));
    // Make sure our separator doesn't appear in the salt, or explode() will split at the wrong place
    str_replace('|', '-', $salt);
    $xor = $input ^ $salt;
    return base64_url_encode("$salt|$xor");
}

function deobfuscate($input)
{
    [$salt, $xor] = explode('|', base64_url_decode($input), 2);
    return $salt ^ $xor;
}

这给出了这样的字符串:

maps/shop1.jpg: NubGQVCitxcciGC8wht8W4e2Mn_R33hsuU7Wsnw-
maps/shop2.jpg: ePr0T12ft29NwpNMslN8FZuEPHLs3wA98L0mwjQ-
maps/shop3.jpg: 7stRD6lwniLozbmY_fJ8g6ohfIYD9k2Y_pfyjZU-
maps/shop4.jpg: 1ArPov5EmGqyikHyN2l8uWu_0dE38AXCvm.YRw4-
maps/shop5.jpg: tQN2RHTzN.LCEHu1URJ82GIGN1uAX42yJVXfIXU-

(这种情况的一种变体是使用字符串的 MD5 或 SHA1 哈希值作为盐,这样每个字符串将始终具有相同的混淆形式,但仍然很难猜测。)

您甚至可以异或第二个未传输的固定字符串(“ key ”),使其成为一个非常简单的加密方案。但如果你想要安全,你最好只使用真正的加密函数,如 sodium_crypto_secretbox .

关于php - 有没有办法创建可逆的不透明 UUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64062023/

相关文章:

php - 如何更新不同列中的某些值?

php - 同一队列中多台机器上的 Laravel 队列监听器

php - 如何在 Guzzle http 中添加 header

php - 通过检索 id PHP foreach 删除 mysql 行

php - Yii 中 Bootstrap Modal 和 Select2 的问题

javascript - 如何在不刷新的情况下显示php传递的结果给ajax

php - FullCalendar 使用数据库和谷歌日历

PHP - 仅包含 ASCII 扩展字符的字符串

php - 数组到字符串的转换和只有变量应该通过引用传递

php - 如何使用反射在运行时用php扩展一个类