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

 mobiledu2502853033 发布于 2022-11-18 04:46

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


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


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

3 个回答
  • 我觉得你应该加入的是权限判断的功能,比如根据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";
    2022-11-18 04:58 回答
  • hash some+random some

    2022-11-18 04:58 回答
  • 是这样的,如果你的目的是防止用户查看别的用户的数据,那么你的思路是有点偏差的。

    你应该要做的是在后端做鉴权而不是去加密 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...

    2022-11-18 04:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有