什么';在php中,加密字符串和传递url的简单对称方法是什么?
如问题所述,我需要一种方法来加密字符串(即“x=27&y=3&z=123456”到“hUIgBG5664y65H2UIB”),以便它可以通过html图像源传递,如下所示:什么';在php中,加密字符串和传递url的简单对称方法是什么?,php,url,encryption,obfuscation,encryption-symmetric,Php,Url,Encryption,Obfuscation,Encryption Symmetric,如问题所述,我需要一种方法来加密字符串(即“x=27&y=3&z=123456”到“hUIgBG5664y65H2UIB”),以便它可以通过html图像源传递,如下所示: <img src="returnpicture.php?stuff=hUIgBG5664y65H2UIB"/> returnpicture.php会将其解密回'x=27&y=3&z=123456'并将其解析为三个变量,用于拾取图像并返回 问题是,无论我到哪里,我都能找到一些关于对信用卡和密码等超级敏感信息进行
<img src="returnpicture.php?stuff=hUIgBG5664y65H2UIB"/>
returnpicture.php会将其解密回'x=27&y=3&z=123456'并将其解析为三个变量,用于拾取图像并返回
问题是,无论我到哪里,我都能找到一些关于对信用卡和密码等超级敏感信息进行哈希和加密的东西。这个信息一点也不敏感,我只是不希望用户能够篡改它。因此,它不应该太长。另外,加密(我猜)必须是字母数字的,这样就不会把url弄乱&或=。我正在用php做这件事
这是一种游戏。用户不应该弄乱变量,因为他们会看到一些他们还不应该看到的东西。了解一般情况 当您在请求url中包含某些键值对时,PHP会将这些值(相应地)加载到
$\u GET
超全局中
?x=12&y=13
将导致
$_GET['x'] // contains 12
$_GET['y'] // contains 13
您似乎试图在一个键值对中提供多个键值对:
?stuff={more-key-value-pairs}
请注意,PHP不会解释$\u GET['stuff']
中的键值对
编码/解码
注意:这是多种解决方案中的一种。找到最适合你的,并加以应用
您可以使用对其进行编码和解码
例如:
echo '<img src="returnpicture.php?stuff=' . rawurlencode( base64_encode('x=27&y=3&z=123456') ) . '" />';
要取回原始字符串
但是,如果您实际上计划发送一个get请求,比如字符串(带有变量赋值,例如?x=12&y=13
等等),那么您需要应用进一步的技术来解析该字符串
我建议您可以使用
$\u SESSION
vars在页面之间共享信息,但是,只有当两个页面位于同一上下文服务器中时,它才起作用
方法1。base64
编码
<img src="returnpicture.php?stuff=<?php echo base64_encode('x=27&y=3&z=123456'); ?>"/>
方法2.$\u会话变量
您应该将$\u GET
与$\u 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; ?>"/>
你可以使用一个简单的密码,比如滚动XOR散列。这很容易实现,但如果唯一的好处是一些微不足道的事情,比如让你的服务器提供非标准大小的图像,那么人们可能就不会费心去破解它了
function scramble(key, text) {
return encodeURIComponent(text.replace(/[^\0]/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(/[^\0]/g, function(x, i) {
var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
return String.fromCharCode(code);
});
}
如果键
是“secretcode”,而文本
是“x=27&y=3&z=123456”,则加扰(键,文本)
返回“%0BXQEC%0D%5E%5CB%1ntqau”
使用相同的键对结果进行“解扰”,得到原始文本,“x=27&y=3&z=123456”
请注意,您可能希望在PHP方面这样做,JavaScript代码只是作为一个示例
“此信息一点也不敏感,我只是不希望用户能够篡改。”,如果它不敏感,那么你为什么要关心它是否被篡改?如果你不关心他们是否可以读取它,但你关心他们是否修改了它,那么请查看HMAC。在我们网站的应用程序中,我们只使用base64。然后使用令牌/nonce。将实际数字存储在数据库中,并给出一个随机id。如果你使用的加密不是字母数字,只需使用urlencode()将其包装
来解决这个问题。为什么你首先需要加密?为什么不按原样传递参数?base64
不是一种加密,尽管你是对的。鉴于问题的标题,我假设OP实际上不是在寻找加密,而是在寻找一种方法来屏蔽他的参数;使用术语加密
,以避免一个更好的词。当然可能是一个错误的假设。在任何情况下,提供的解决方案可能仍然适合他的需要,如果它不适合,它仍然有希望增加一般的理解。在我看来,他只是在寻找模糊,而不是加密。他说它不敏感,他只是不希望它容易被篡改。如果页面可以有mu这些图像中有很多,每个都有不同的参数,这是如何工作的?
<img src="returnpicture.php?stuff=<?php echo $postfix; ?>"/>
$sensible_var1 = $_SESSION['sensible_var1_'.$_GET['stuff']];
$sensible_var2 = $_SESSION['sensible_var2_'.$_GET['stuff']];
$sensible_var3 = $_SESSION['sensible_var3_'.$_GET['stuff']];
function scramble(key, text) {
return encodeURIComponent(text.replace(/[^\0]/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(/[^\0]/g, function(x, i) {
var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
return String.fromCharCode(code);
});
}