php有哪些加解密快的方法可以加密uid等id?

以前一直都是直接把id作为get参数在前端各种传,比如a.com?uid=16这样的地址,如果用户发现了这个规律,只要把16改成17、18、19等等,就可以查看各个用户的数据了,所以想问问你们是怎么解决的?


需求不是说不允许用户查看其它用户的资料,而是谁都可以看。那为什么还有这种需求呢?这就好像是微信的微信号一样,只要有了微信号就能搜到那个人,没有微信号,也很难通过撞库、运气等找到那个人。优酷、土豆、B站,所有视频网站都没有直接把视频的id显示到地址栏上的,都是经过加密的。(如果视频网站在数据库是不用连续id的,那当我没说过…事实上我也的确没看过上述网站的数据库)


要求是,加解密速度快,破解难。(前者优先)

是这样的,如果你的目的是防止用户查看别的用户的数据,那么你的思路是有点偏差的。

你应该要做的是在后端做鉴权而不是去加密 uid。举个例子,比如说现在已登录的用户是 uid=16,那么当他请求 a.com?uid=17(或者其他非 16 的页面),后端应该能判断出他没有权限并给出相应的返回(如输出空白页面,或者是直接抛 403 之类)。
至于说怎么去实现鉴权,简单的就是把已登录用户的 uid 记录在 $_SESSION['uid'] 里,每次请求的时候判断 $_GET['uid'] == $_SESSION['uid'] 是否为真。


2016-10-26 21:51 补充: <<<
题主更新了题目说需求是谁都可以看到用户资料,只是想把用户的 uid 隐藏起来。遇到这种情况,我的做法是在用户表增加一个字段 openid 并将其加入索引,在用户注册时可以通过 uidUNIX 时间戳若干长度的随机字符串 等组合后通过 md5() 一类的函数来生成一个唯一的 openid,对外公开资料的情况下就通过 openid 来检索数据。
<<<EOF


如果你坚持要用加密的方式,可以自己到网上搜一下,已经有很多现成的成熟的解决方案了,我用 PHP加解密 为关键词在 Google 搜索,第一页几乎全都是你想要的东西,例如下面这段代码摘自搜索结果中的第一条,你可以参考(我未做测试)。

<?php
    
    // 設定金鑰, 負責對資料進行加解密 
    $key = "ac181c517bdf24ce053556bb280a2dcb";

    /**
     * 加密函數
     */
 function encrypt($str)
 {
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  
  return base64_encode(trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, self::$key, $str, MCRYPT_MODE_ECB, $iv)));  
 }

      /**
     * 解密函數
     */
 function decrypt($str)
 {
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::$key, base64_decode($str), MCRYPT_MODE_ECB, $iv));  
 } 
?>

出处:http://jerry17768java.blogspo…

hash some+random some

我觉得你应该加入的是权限判断的功能,比如根据cookie识别用户.
加/解密可以用OpenSSL AES:

<?php
header('Content-Type: text/plain;charset=utf-8');
$data = 'phpbest';
$key = 'oScGU3fj8m/tDCyvsbEhwI91M1FcwvQqWuFpPoDHlFk='; //echo base64_encode(openssl_random_pseudo_bytes(32));
$iv = 'w2wJCnctEG09danPPI7SxQ=='; //echo base64_encode(openssl_random_pseudo_bytes(16));
echo '内容: '.$data."\n";

$encrypted = openssl_encrypt($data, 'aes-256-cbc', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv));
echo '加密: '.base64_encode($encrypted)."\n";

$encrypted = base64_decode('To3QFfvGJNm84KbKG1PLzA==');
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv));
echo '解密: '.$decrypted."\n";
  • 下载gitbook上的pdf书籍后 如何转化为html
  • laravel5+FrozenNode/Administrator
  • php数组键名 直接使用目录名 VS md5(目录名)?
  • PHP怎么同时执行,或者说多个进程执行?
  • 谁熟悉php_printer如何使用php操作连接到windows的打印机?
  • 求解类似数据如何搜索!
  • 我把session存入数据库后,读取所有会话信息的时候,出现了一个问题?
  • 大家平常怎么减少自己的bug率
  • mac 下安装redis扩展一直目录没权限,那么php扩展如何指定位置安装?
  • 规范来说,所有可能被throw的exception都要去catch吗?
  • php短信模版中变量替换?