2

任何人都可以建议一种通用的 PHP 加密/解密算法,该算法以下列方式加密:

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

安全不是这里的主要关注点。我只是想防止随意的“黑客”通过更改 URL 轻松访问某些页面(例如 www.domain.com/?id=1 可以轻松更改为 www.domain.com/?id=2)。

4

4 回答 4

3

不能用 MySQL 自带的 MD5 功能吗?

您可以使用 MD5 对数据库 ID 进行哈希处理,然后 URL 将类似于

mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs

例如

$id = $_GET['id'];

在 MySQL 中

select * from product where md5(id) =  $id;
于 2014-04-24T13:43:07.207 回答
2

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

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

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

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

  1. 将数据上传到 sql 数据库时,应始终在后端进行加密,而不是在客户端进行。一般规则是客户端处理越少越好。这是客户端与从 $row['id'] 是密钥的 sql 数据库中提取 $row['url'] 或提取 id 然后运行加密的区别。这增加了 1 步客户端。
  2. 尽管可能性极小,但使用如下加密方式可能会产生重复。(如果您的站点有 1000 多个密钥,则重复的机会更高)因此为防止重复,您需要加密密钥,然后进行 sql 搜索以检索所有密钥,加密每个密钥,然后将每个密钥与当前的加密密钥。这会使您的处理时间增加 4 倍(无论您拥有多少密钥)。
  3. 真的,这只是糟糕的形式。如果您永远想根据加密的 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']。

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

于 2012-08-03T02:16:42.170 回答
2

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

河豚是你可以搭配的东西。您使用密钥加密 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 编号不会超过 2821109907455(并且它们不是负数),这应该没问题。只要 17 个字节的标识符对您来说是可以的(来自 encrypt 函数的 16 个字节的加密数据和一个字节的硬编码字母,以确保您的 html 属性以字母开头)。

于 2012-08-03T10:21:07.240 回答
1

如果您需要自己生成 ID,则该uniqid()功能可能是您正在寻找的功能。

于 2012-08-03T02:16:08.700 回答