我正在构建一个源代码系统,我将在“网络上提供可用于虚拟宠物的网络”。该系统将主要由儿童拥有。因为我希望它可用于绝对的初学者程序员,所以我的系统有几个复杂性限制:它不能使用通常不附带PHP的库,也不能触及数据库或写入其他永久存储器
当每只宠物被采用时,访客将随机获得该宠物的一系列略有不同的变体之一。变化最初看起来是一样的,但随着时间的推移长大成为不同的宠物。访问者将获得HTML的简短代码,该代码链接到他们宠物的图像。由于服务器端没有永久存储空间,因此用户的图像链接必须包含所有信息,以确定最终获得的宠物变体。
目前,网址只包含宠物的ID和用户获得的变体的ID。这样做的问题在于,通过将代码相互比较,用户可以确定其中的哪些人最终得到了相同的变体。由于某些变化比其他变种更少,因此用户可以在差异甚至在视觉上显而易见之前轻松发现罕见变化。
我想要的是URL中详细信息的加密系统。掩盖变体ID的东西,以便每个用户获得具有高概率的不同URL。我想过使用变量ID(3或4位)作为大随机数的低位或高位,但是用户会在其中发现模式。理想情况下,加密系统将进行参数化,以便我的系统的每次安装都使用稍微不同的加密。
PHP的mcrypt库可能会有一些有用的东西,但它在主机中似乎并不常见。
我可以在这里使用简单的,参数化的混淆/加密吗?
答案 0 :(得分:16)
您正在寻找“一次性填充”加密。它需要一个键并为字符添加模数以创建加密字符串。
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
答案 1 :(得分:10)
如果您期望相对较低的复杂程度,那么您可以进行非常简单的“xor”加密,并将密钥“存储”为URL的一部分。然后你可以使用php的rand()或/ dev / random或其他任何东西来生成密钥。
低度熟练的用户不会轻易弄清楚他们需要做的就是将他们的宠物ID的下半部分与上半部分相比得到一个可以与他们的朋友比较的值。我猜大多数能够认识到这一点的人都不会花时间去弄明白,而且那些人无论如何都不在目标受众之列。
编辑:如果不明显,我说你给每只宠物一个不同的钥匙(因为给同一个宠物不会解决你的问题)。因此,如果宠物变体(petvar)是16位数,则生成一个16位随机数(rnd),然后执行此操作:petvar = (petvar^rnd)<<16 | rnd;
然后您可以反转该操作以提取rnd然后petvar ^ rnd,然后再次xor再次获得原始的petvar。
答案 2 :(得分:2)
为什么不给每个用户一个长的随机ID,然后在服务器上存储他们宠物的所有细节?最佳做法是不在URL中存储任何内容,不加密或不加密。您只需要一个会话ID。