在 php 中加密字符串并通过 url 的简单对称方法是什么?



正如问题所述,我需要一种方法来加密字符串(即'x=27&y=3&z=123456'到'hUIgBG5664y65H2UIB'),以便它可以通过html图像源传递,如下所示:

<img src="returnpicture.php?stuff=hUIgBG5664y65H2UIB"/>

returnPicture.php 会将其解密回 'x=27&y=3&z=123456' 并将其解析为三个变量,用于选择图像并返回它。

问题是,无论我在哪里看,我都能找到的都是关于散列和加密信用卡和密码等超级敏感信息的东西。 此信息根本不敏感,我只是不希望用户能够篡改它。 因此,它不应该太长。 此外,加密(我猜)必须是字母数字,以免用 &或 = 弄乱 url。 我正在用 php 做这件事。

这是为了一种游戏。 用户不应该弄乱变量,因为他们会看到他们不应该看到的东西。

一般理解

当您在请求 url 中包含某些键值对时,PHP 会(相应地)将这些值加载到$_GET超全局中。

?x=12&y=13

将导致

$_GET['x'] // contains 12
$_GET['y'] // contains 13

您似乎试图做的是在键值对中提供多个键值对:

?stuff={more-key-value-pairs}

只需注意 PHP 不会在 $_GET['stuff'] 中解释键值对。

编码/解码

注意:这是众多可能的解决方案之一。找到最适合您的一个并应用它。

您可以使用 base64_encode() 对其进行编码,并使用 base64_decode() 对其进行解码。

例:

echo '<img src="returnpicture.php?stuff=' . rawurlencode( base64_encode('x=27&y=3&z=123456') ) . '" />';  

使用 rawurlencode() 可确保对 base64 编码的字符串进行正确的 url 安全编码。

返回图片中.php您可以使用:

$decodedString = base64_decode( $_GET['stuff'] );

以取回原始字符串。

但是,如果您实际上计划发送类似字符串的 get-request(带有变量赋值,例如 ?x=12&y=13 等),那么您需要应用进一步的技术来解析该字符串。

有关如何完成的详细信息,请参阅此问题

您可以使用简单的密码,例如滚动 XOR 哈希。这很容易实现,但足以令人讨厌,如果唯一的好处是微不足道的东西,比如能够让你的服务器提供非标准尺寸的图像,人们可能不会打扰。

function scramble(key, text) {
    return encodeURIComponent(text.replace(/[^]/g, function(x, i) {
        var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
        return String.fromCharCode(code);
    }));
}
function descramble(key, text) {
    return decodeURIComponent(text).replace(/[^]/g, function(x, i) {
        var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
        return String.fromCharCode(code);
    });
}

如果你的key是"secretcode",你的text是"x=27&y=3&z=123456",那么scramble(key, text)返回"%0BXQEC%0D%5E%5CB%1FNTQAQAU"。

具有相同key结果的"解扰"给出了原始text,"x=27&y=3&z=123456"。

请注意,您可能希望在PHP方面执行此操作,JavaScript代码仅作为示例。

http://jsfiddle.net/m92rc/

我建议您可以使用$_SESSION变量在页面之间共享信息,但是,它仅在两个页面位于同一上下文服务器中时才有效。

方法1. base64编码

<img src="returnpicture.php?stuff=<?php echo base64_encode('x=27&y=3&z=123456'); ?>"/>

并得到这个作为:

$data = base64_decode($_GET['stuff']);

方法2. $_SESSION变量

您应该$_GET$_POST相结合,而不会公开明智的信息,例如:

$postfix = uniqid(); // Generate an UNIQUE id
$_SESSION['sensible_var1_'.$postfix] = "value";
$_SESSION['sensible_var2_'.$postfix] = "value";
$_SESSION['sensible_var3_'.$postfix] = "value";

并且您只能通过以下方式传递此信息:

<img src="returnpicture.php?stuff=<?php echo $postfix; ?>"/>

returnpicture.php 文件中,您可以检索信息:

$sensible_var1 = $_SESSION['sensible_var1_'.$_GET['stuff']];
$sensible_var2 = $_SESSION['sensible_var2_'.$_GET['stuff']];
$sensible_var3 = $_SESSION['sensible_var3_'.$_GET['stuff']];

最新更新