首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP中的简单加密

PHP中的简单加密
EN

Stack Overflow用户
提问于 2008-11-29 03:08:43
回答 3查看 16.7K关注 0票数 9

我正在构建一个有源代码的系统,我在网上发布了这个系统,用于提供可供领养的虚拟宠物。这个系统将主要由孩子们拥有。由于我希望它对绝对的初学者程序员有用,所以我的系统有几个复杂性限制:它不能使用通常不与PHP一起提供的库,并且它不能接触数据库或写入其他永久存储。

当每只宠物被领养时,参观者将随机获得该宠物的一系列略有不同的变体之一。这些变体最初看起来是一样的,但随着时间的推移,它们会长成不同的宠物。参观者将得到一个简短的HTML代码,它链接到他们宠物的图像。由于服务器端没有可用的永久存储,因此用户的图像链接必须包含所有信息,以确定他们最终得到的宠物变体。

目前,URL只包含宠物的ID和用户获得的变体的ID。这样做的问题是,通过相互比较代码,用户可以找出其中谁最终得到了相同的变体。由于一些变体比其他变体更罕见,用户可以在差异甚至在视觉上明显之前就很容易地发现罕见的变体。

我想要的是一个在网址的细节加密系统。一些东西模糊了变体ID,使得每个用户获得一个不同的URL的可能性很大。我想使用变体ID (3或4位)作为大随机数的低位或高位,但用户会在其中发现模式。理想情况下,加密系统应该是参数化的,这样我的系统的每次安装都会使用略有不同的加密。

PHP的mcrypt库中可能有一些有用的东西,但它在主机中似乎并不常见。

有没有简单的,参数化的,模糊的/加密的,我可以在这里使用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

票数 11
EN

Stack Overflow用户

发布于 2008-11-29 05:16:17

您正在寻找“一次性填充”加密。它采用一个密钥,并对字符进行模加运算,以创建加密字符串。

代码语言:javascript
运行
复制
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;
}

这就是简单的字符串加密。我要做的是序列化用户参数的数组,并将其作为链接中的变量传递:

代码语言:javascript
运行
复制
$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中,你应该做相反的事情:

代码语言:javascript
运行
复制
$param_string = $_GET["params"];
$params = unserialize(decrypt($param_string));

Bam。

票数 16
EN

Stack Overflow用户

发布于 2008-11-29 04:46:21

为什么不给每个用户一个长的随机ID,然后将他们宠物的所有详细信息存储在服务器上呢?最佳实践是不在URL中存储任何内容,无论是否加密。您需要的只是一个会话ID。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/327097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档