任何人都可以推荐一种通用的PHP加密/解密算法,它可以通过以下方式加密:
安全不是这里的主要关注点。我只是想阻止随意的“黑客”通过更改URL轻松访问某些页面(例如www.domain.com/?id=1可以轻松更改为www.domain.com/?id=2)。
答案 0 :(得分:2)
如果你真的真的想加密你的主键(非常低效,稍后会解释)然后使用
$url = substr(md5(uniqid($row['id'], true)),0,6);
其中row ['id']是您的主键。这会创建一个url / html safe 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();
}
}
使用此代码,您有一步客户端,以获取行,其中您接收行['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()
函数可能就是您要找的。 p>
答案 3 :(得分:1)
你不能使用MySQL的内置MD5功能吗?
您可以使用MD5来散列数据库ID,然后URL将类似于
mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs
E.g。
$id = $_GET['id'];
在MySQL中
select * from product where md5(id) = $id;