加密&;用PHP解密:快速、简短、有效的HTML ID&;URL安全

加密&;用PHP解密:快速、简短、有效的HTML ID&;URL安全,php,encryption,Php,Encryption,有谁能推荐一种通用的PHP加密/解密算法,它可以通过以下方式进行加密: 很快 它很短,类似于YouTube的视频ID 可以用作有效id(元素属性) 可以安全地用作URL的一部分 安全不是这里的首要问题。我只是想通过更改URL(例如,www.domain.com/?id=1可以很容易地更改为www.domain.com/?id=2)来防止偶然的“黑客”轻松访问某些页面。如果您需要自己生成id,该函数可能就是您想要的。如果您真的想加密您的主键(效率很低,稍后解释)然后使用 其中,行['id']是您的

有谁能推荐一种通用的PHP加密/解密算法,它可以通过以下方式进行加密:

  • 很快
  • 它很短,类似于YouTube的视频ID
  • 可以用作有效id(元素属性)
  • 可以安全地用作URL的一部分

  • 安全不是这里的首要问题。我只是想通过更改URL(例如,www.domain.com/?id=1可以很容易地更改为www.domain.com/?id=2)来防止偶然的“黑客”轻松访问某些页面。

    如果您需要自己生成id,该函数可能就是您想要的。

    如果您真的想加密您的主键(效率很低,稍后解释)然后使用

    其中,行['id']是您的主键。这将创建一个url/html安全的6个字符串,所有字符串都将是唯一的(某种程度上,请参见下文)

    这就是为什么你不应该这样做

  • 将数据上载到sql数据库时,加密应始终在后端进行,而不是客户端。一般规则是客户端处理越少越好。这是客户端与从sql数据库中提取$row['url']的区别,其中$row['id']是密钥,或者提取id然后运行加密。这在客户端又增加了一个步骤
  • 虽然不太可能,但使用下面这样的加密可能会有重复(如果您的站点有1000多个密钥,则重复的几率更高)因此,为了防止重复,您需要加密您的密钥,然后执行sql搜索以检索所有密钥,加密每个密钥,然后将每个密钥与当前加密的密钥进行比较。这将使处理时间增加4倍(无论您拥有多少密钥)
  • 实际上,这只是一个糟糕的表单。如果你想根据加密的url搜索页面,你必须再次检索所有密钥并加密并比较所有密钥
  • 对于其他所有人,如果您想要提高效率,请使用此功能

    我有创建唯一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();
      }
    }
    
    使用此代码,您只需在客户端执行一个步骤,即可获取id所在的行,然后接收行['rl']


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

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

    河豚鱼是你可以选择的。您可以使用密钥加密id,并以十六进制格式输出它。这样,您就拥有了16字节的十六进制编码标识符(只要数字id适合Blowfish的块大小)

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


    这种方法存在密码缺陷,但假设您的id号不会超过282110907455(并且不是负数),这应该是可以的。只要17字节的标识符对您来说是可以的(16字节的加密数据来自加密函数,一字节的硬编码字母确保您的html属性以字母开头)。

    您不能使用MySQL的内置MD5函数吗

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

    mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs
    
    例如

    在MySQL中

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


    我想您正在寻找类似的东西,但不是加密。base64不起作用。首先,它往往很长。此外,字符is-use对ID无效,等等(例如base64_-encode(1)是MQ==)。最后,我不希望它是如何被加密的(从而使解密变得如此容易),构建你自己的算法-这样你就可以enc/dec了。这不太容易hard@metal_fan-这正是我需要帮助的地方。Hashids库支持多种不同的编程语言,并允许您指定salt。我正在使用数据库主键,需要对其进行加密。除非您指的是数字、自动递增的值,否则没有理由不能将这些值作为主键存储在数据库中。但你可能做到了,所以我道歉并祝你好运。:-)非常慢的功能BTWI不需要唯一的id。我已经有了:我的数据库的主键。我想加密该密钥,然后稍后解密。如果以后需要解密,只需使用base64_encode()和base64_decode()。我不认为这有什么实际用途,最好是用递增的密钥作为主密钥,然后用加密的id作为URL。天哪,我觉得很愚蠢,我已经用我的方式做了很多年了(见答案)。我从未想过在数据库中存储加密的ID。你的方式FTW。很高兴接受我的+1:)@BrandenStilgarSueper-base64_编码将无法工作,因为它使用的字符对HTML ID无效。此外,将加密id存储在DB中也不好,因为它是一个计算值。为什么要先加密主文件,然后再存储它?即使我这样做了——我仍然需要知道如何首先加密id,这就是我的问题所在。@BrandenStilgarSueper——我想加密我的主键(数字,自动递增),这样结果就可以安全地用作HTML id。它还需要安全地用作URL的一部分(不必进行URL编码等).我不想只加密/解密。加密的id需要是HTML id和URL安全的。我尝试了你的加密函数并将其传递为“1”。结果为9ca8df3fea86ae5e。这不是一个有效的HTML id。请看我最后一段的第二个答案。换句话说,您需要硬编码字母前缀。比如:a9ca8df3fea86ae5e(注意“a”),然后在传递到解密函数之前删除它。删除了不正确的最后一段,所以我之前的评论应该是“查看我的答案最后一段”。只是为了澄清一下,此解决方案确实有效,但仅适用于数字ID,这不会加密/解密字符串。
    mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs
    
    $id = $_GET['id'];
    
    select * from product where md5(id) =  $id;