首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 數字專用加密解密類:ID 隱藏、URL 簽名、短鏈接生成的輕量方案

     編輯:PHP 相關知識

業務中常需將數據庫自增 ID、訂單號等數字敏感信息加密後對外暴露(如 URL 參數、前端傳參),防止遍歷攻擊、洩露業務量級。本文提供一個純 PHP、無依賴、可配置長度的 XDeode 類,專門針對**純數字**的可逆加密,加密後字串定長、字符集可讀、無特殊字符,極適合 URL 傳遞。

核心原理:標記長度 + 補位 + 數字替換

  1. 打亂基準字符集:62 位字符 (a-z, A-Z, 0-9) 經固定種子打亂。
  2. 分段:前 M 位作「長度標記」,第 M+1 到 M+10 位作「數字 0-9 映射」,剩餘作「補位字符池」。
  3. 加密流程:
    1. 取數字長度 n,從長度標記區取第 n 個字符作首字符。
    2. 計算補位長度 = 總長度 - 1 - n,用 數字 / 密鑰 產生偽隨機數填充補位區。
    3. 逐位將數字 0-9 替換為映射字符。
    4. 拼接:長度標記 + 補位字符 + 替換後數字 = 密文。
  4. 解密:首字符反查長度 → 截取尾部 n 位 → 反向映射還原數字。

類完整代碼

<?php
class XDeode {
    private $strbase = "Flpvf70CsakVjqgeWUPXQxSyJizmNH6B1u3b8cAEKwTd54nRtZOMDhoG2YLrI";
    private $key, $length, $codelen, $codenums, $codeext;

    public function __construct(int $length = 9, $key = 2543.5415412812) {
        $this->length = $length;
        $this->key = $key;
        $this->codelen  = substr($this->strbase, 0, $this->length);
        $this->codenums = substr($this->strbase, $this->length, 10);
        $this->codeext  = substr($this->strbase, $this->length + 10);
    }

    public function encode(int $nums): string {
        $nums = (string)$nums;
        $numslen = strlen($nums);
        $begin = $this->codelen[$numslen - 1]; // 長度標記
        $extlen = $this->length - $numslen - 1;
        $temp = substr(str_replace('.', '', $nums / $this->key), -$extlen); // 補位源
        $rtn = $begin;
        // 補位映射
        foreach (str_split($temp) as $v) $rtn .= $this->codeext[$v];
        // 數字映射
        foreach (str_split($nums) as $v) $rtn .= $this->codenums[$v];
        return $rtn;
    }

    public function decode(string $code): string {
        $begin = $code[0];
        $len = strpos($this->codelen, $begin);
        if ($len === false) return '';
        $len++;
        $rtn = '';
        foreach (str_split(substr($code, -$len)) as $v) {
            $rtn .= strpos($this->codenums, $v);
        }
        return $rtn;
    }
}

// 使用示例
$obj = new XDeode(9);
$encrypted = $obj->encode(123456); // 如 "vmizxPPga"
$decrypted = $obj->decode($encrypted); // "123456"
echo "[$encrypted] = [$decrypted]";

特性對比

特性XDeodeOpenSSL AESHashids
輸入類型純數字任意二進制純數字/陣列
輸出定長✅ 可配置❌ 隨輸入變化✅ 可配置最小長度
字符集字母數字Base64/十六進制字母數字
依賴零OpenSSL 擴展Composer 套件
安全性混淆級(非加密級)加密級混淆級

適用場景與避坑指南

  • ✅ 適用:數據庫 ID 隱藏、短鏈接碼、邀請碼、訂單號外部展示
  • ❌ 不適用:密碼、Token、支付金額、任何需「加密級」安全的數據
  • ⚠️ 同一實例參數 (length, key, strbase) 必須一致,否則解密失敗。建議將參數寫入配置文件,構造函數注入。
  • ⚠️ 最大加密位數 = length - 1 (需 1 位存長度標記),超位數會報錯或截斷。

若需更高安全性,請改用 openssl_encrypt() (AES-256-GCM) + Base64UrlEncode,並妥善管理金鑰輪換。本類定位為「輕量級數字混淆」,在中小型項目中極具性價比。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved