簡體   English   中英

有沒有辦法創建可逆的不透明 UUID?

[英]Is there a way to create a reversible opaque UUID?

要求

我們需要一個 php-only 系統以可逆的方式將文件路徑/文件名.ext 映射到 UUID。

例子

例如:

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

用戶只能從

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

loader.php必須能夠“反​​轉”UUID,以便腳本可以發送maps/show1.jpg

目標

此階段的主要目標不是保護內容訪問。

我們現在的目標只是添加一個“不透明度”級別,以避免用戶可以打開例如shop2.jpg只需更改 URL。

問題

目前,我們無法將 UUID<--> 文件映射保存到數據庫或類似文件中。

因此,我請求“即時”創建與文件路徑/文件名.txt 相對應的 UUID,並且此 UUID必須是可逆的,以便 PHP 腳本可以“解碼”它並提供相應的文件。

UUID 算法的可逆字符串是否已經存在?

聽起來您希望很難猜測 URL 或發現其中的模式。 另一個答案中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 哈希值作為鹽,這樣每個字符串將始終具有相同的混淆形式,但仍然難以猜測。)

您甚至可以對未傳輸的第二個固定字符串(“密鑰”)進行異或,使其成為一個非常簡單的加密方案。 但是如果你想要安全,你最好只使用一個真正的加密函數,比如sodium_crypto_secretbox

那么你正在尋找的是一種編碼/解碼算法。 有十六進制和 base64 編碼通常用於上述情況,但如果你真的想要一些獨特的東西,你必須創建自己的。

這是一個 url 安全的 base 64 編碼/解碼示例:

/**
 * Encode a string to URL Safe base 64
 */
function base64_url_encode($input)
{
    $result = strtr(base64_encode($input), '+/=', '._-');
    //remove padding
    $start = strlen($result) - 2;
    $pos = strpos($result, '-', $start);
    if ($pos !== false) {
        $result = substr_replace($result, "", $pos);
    }
    return $result;
}

/**
 * Decode a string from URL Safe base 64
 */

function base64_url_decode($input)
{
    //add back padding
    $input = str_pad($input, ceil(strlen($input)/4)*4, '-');
    return base64_decode(strtr($input, '._-', '+/='));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM