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

WBOY
Libérer: 2023-03-02 12:42:01
original
2037 Les gens l'ont consulté

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


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


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

<code class="PHP"><?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));  
 } 
?></code>
Copier après la connexion

出处:http://jerry17768java.blogspo...

hash some+random some

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

<code><?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";</code></code>
Copier après la connexion
Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!