任何人都可以建议一种通用的 PHP 加密/解密算法,该算法以下列方式加密:
- 它很快
- 它很短,类似于 YouTube 的视频 ID
- 可以用作有效的 id(一个元素属性)
- 可以安全地用作 URL 的一部分
安全不是这里的主要关注点。我只是想防止随意的“黑客”通过更改 URL 轻松访问某些页面(例如 www.domain.com/?id=1 可以轻松更改为 www.domain.com/?id=2)。
任何人都可以建议一种通用的 PHP 加密/解密算法,该算法以下列方式加密:
安全不是这里的主要关注点。我只是想防止随意的“黑客”通过更改 URL 轻松访问某些页面(例如 www.domain.com/?id=1 可以轻松更改为 www.domain.com/?id=2)。
不能用 MySQL 自带的 MD5 功能吗?
您可以使用 MD5 对数据库 ID 进行哈希处理,然后 URL 将类似于
mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs
例如
$id = $_GET['id'];
在 MySQL 中
select * from product where md5(id) = $id;
如果你真的真的很想加密你的主键(非常低效,稍后会解释)然后使用
$url = substr(md5(uniqid($row['id'], true)),0,6);
其中 row['id'] 是您的主键。这将创建一个 url/html 安全的 6 字符串,所有字符串都是唯一的(有点,见下文)。
现在。这就是为什么你不应该这样做。
对于其他所有人,如果您想要效率,请使用此
我有创建唯一 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 的块大小)。
大致类似于(不包括验证):
$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 属性以字母开头)。
如果您需要自己生成 ID,则该uniqid()
功能可能是您正在寻找的功能。