加密&用PHP解密:快速,简短,有效的HTML ID&网址安全

时间:2012-08-03 02:09:25

标签: php encryption

任何人都可以推荐一种通用的PHP加密/解密算法,它可以通过以下方式加密:

  1. 很快
  2. 很简短,类似于YouTube的视频ID
  3. 可以用作有效的id(元素属性)
  4. 可以安全地用作URL的一部分
  5. 安全不是这里的主要关注点。我只是想阻止随意的“黑客”通过更改URL轻松访问某些页面(例如www.domain.com/?id=1可以轻松更改为www.domain.com/?id=2)。

4 个答案:

答案 0 :(得分:2)

如果你真的真的想加密你的主键(非常低效,稍后会解释)然后使用

$url = substr(md5(uniqid($row['id'], true)),0,6);

其中row ['id']是您的主键。这会创建一个url / html safe 6字符串,所有这些都是唯一的(有点,见下文)。

现在。这就是你不应该这样做的原因。

  1. 在将数据上传到sql数据库而不是客户端时,应始终在后端进行加密。一般规则是客户端处理越少越好。客户端不同于从你的sql数据库中提取$ row ['url'],其中$ row ['id']是密钥,或拉动id然后运行加密。这增加了一步客户端。
  2. 虽然极不可能,但使用类似下面的加密可能会产生重复。 (如果您的网站有1000多个密钥,则重复的可能性更高)所以为了防止重复,您需要加密密钥,然后执行sql搜索以检索所有密钥,加密EACH密钥,然后比较每个密钥当前加密的密钥。这会为你的处理时间增加4倍(无论你有多少把钥匙)。
  3. 真的只是糟糕的形式。如果您想永远想要根据加密的网址搜索网页,则必须再次检索所有密钥并加密+比较所有密钥。
  4. 如果您想提高效率,请其他人使用

    我有创建唯一ID的脚本

    $token = substr(md5(uniqid(rand(), true)),0,6); // creates a 6 digit token
    

    我使用mysql数据库来存储以前使用的id,你可以使用任何其他类型的数据库来存储Id。

    function generateUniqueID () {
      $token = substr(md5(uniqid(rand(), true)),0,6); // creates a 6 digit token
      $query = "SELECT count(*) FROM table WHERE url = $token";
      $result = mysql_query($query, $connection) or die(mysql_error());
      $numResults = mysql_num_rows($result);
      if ($numResults) {
        generateUniqueID();
      }
    }
    

    使用此代码,您有一步客户端,以获取行,其中您接收行['rl']。

    请阅读program efficiency并查看mysql的文档,这样做,您将获得更多满意的客户:)

答案 1 :(得分:2)

如果不可能修改数据库并添加新列来保存“标识符”,则可以使用块大小的块密码。

Blowfish是你可以使用的东西。您使用密钥加密id并以十六进制格式输出。这样你最终得到16字节的十六进制编码标识符(只要数字id符合Blowfish的块大小)。

大致相似(不包括验证):

$key = md5('crypto key...', true); // For demonstration purpose

function encrypt($id, $key)
{
    $id = base_convert($id, 10, 36); // Save some space
    $data = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $id, 'ecb');
    $data = bin2hex($data);

    return $data;
}

function decrypt($encrypted_id, $key)
{
    $data = pack('H*', $encrypted_id); // Translate back to binary
    $data = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $data, 'ecb');
    $data = base_convert($data, 36, 10);

    return $data;
}

这种方法存在加密缺点,但假设您的id-number不会增长超过2821109907455(并且它们不是负数),这应该没问题。只要17字节标识符是o.k.为你(来自加密函数的16字节加密数据和硬编码字母的一个字节,以确保你的html属性以字母开头)。

答案 2 :(得分:1)

如果您需要自己生成ID,uniqid()函数可能就是您要找的。

答案 3 :(得分:1)

你不能使用MySQL的内置MD5功能吗?

您可以使用MD5来散列数据库ID,然后URL将类似于

mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs

E.g。

$id = $_GET['id'];

在MySQL中

select * from product where md5(id) =  $id;