首頁 > 後端開發 > php教程 > php有哪些加解密快的方法可以加密uid等id?

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

WBOY
發布: 2023-03-02 12:42:01
原創
2096 人瀏覽過

以前一直都是直接把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>
登入後複製

出處: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>
登入後複製
相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板