我正在构建一个有源代码的系统,我在网上发布了这个系统,用于提供可供领养的虚拟宠物。这个系统将主要由孩子们拥有。由于我希望它对绝对的初学者程序员有用,所以我的系统有几个复杂性限制:它不能使用通常不与PHP一起提供的库,并且它不能接触数据库或写入其他永久存储。
当每只宠物被领养时,参观者将随机获得该宠物的一系列略有不同的变体之一。这些变体最初看起来是一样的,但随着时间的推移,它们会长成不同的宠物。参观者将得到一个简短的HTML代码,它链接到他们宠物的图像。由于服务器端没有可用的永久存储,因此用户的图像链接必须包含所有信息,以确定他们最终得到的宠物变体。
目前,URL只包含宠物的ID和用户获得的变体的ID。这样做的问题是,通过相互比较代码,用户可以找出其中谁最终得到了相同的变体。由于一些变体比其他变体更罕见,用户可以在差异甚至在视觉上明显之前就很容易地发现罕见的变体。
我想要的是一个在网址的细节加密系统。一些东西模糊了变体ID,使得每个用户获得一个不同的URL的可能性很大。我想使用变体ID (3或4位)作为大随机数的低位或高位,但用户会在其中发现模式。理想情况下,加密系统应该是参数化的,这样我的系统的每次安装都会使用略有不同的加密。
PHP的mcrypt库中可能有一些有用的东西,但它在主机中似乎并不常见。
有没有简单的,参数化的,模糊的/加密的,我可以在这里使用?
发布于 2008-11-29 03:13:25
如果您期望的是相对较低的复杂程度,那么您可以进行非常简单的"xor“加密,并将密钥”存储“为URL的一部分。然后,您可以只使用php的rand()或/dev/random或其他任何命令来生成密钥。
低复杂度的用户不会轻易想到,他们所需要做的就是将宠物ID的下半部分与上半部分进行xor运算,以获得一个可以与其朋友进行比较的值。我猜大多数能够认识到正在发生的事情的人都不会花时间去弄清楚,而且这些人无论如何都不在你的目标受众之外。
编辑:如果这不明显,我是说你给每个宠物一个不同的钥匙(因为给同样的钥匙不会解决你的问题)。因此,如果宠物变量( petvar )是一个16位数字,您将生成一个16位随机数( rnd ),然后执行以下操作:petvar = (petvar^rnd)<<16 | rnd;,然后您可以反向该操作以提取rnd,然后提取petvar^rnd,然后再次对其进行异或,以获得原始petvar。
发布于 2008-11-29 05:16:17
您正在寻找“一次性填充”加密。它采用一个密钥,并对字符进行模加运算,以创建加密字符串。
function ecrypt($str){
$key = "abc123 as long as you want bla bla bla";
for($i=0; $i<strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return urlencode(base64_encode($result));
}
function decrypt($str){
$str = base64_decode(urldecode($str));
$result = '';
$key = "must be same key as in encrypt";
for($i=0; $i<strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return $result;
}这就是简单的字符串加密。我要做的是序列化用户参数的数组,并将其作为链接中的变量传递:
$arr = array(
'pet_name'=>"fido",
'favorite_food'=>"cat poop",
'unique_id'=>3848908043
);
$param_string = encrypt(serialize($arr));
$link = "/load_pet.php?params=$param_string";在load_pet.php中,你应该做相反的事情:
$param_string = $_GET["params"];
$params = unserialize(decrypt($param_string));Bam。
发布于 2008-11-29 04:46:21
为什么不给每个用户一个长的随机ID,然后将他们宠物的所有详细信息存储在服务器上呢?最佳实践是不在URL中存储任何内容,无论是否加密。您需要的只是一个会话ID。
https://stackoverflow.com/questions/327097
复制相似问题