業務中常需將數據庫自增 ID、訂單號等數字敏感信息加密後對外暴露(如 URL 參數、前端傳參),防止遍歷攻擊、洩露業務量級。本文提供一個純 PHP、無依賴、可配置長度的 XDeode 類,專門針對**純數字**的可逆加密,加密後字串定長、字符集可讀、無特殊字符,極適合 URL 傳遞。
數字 / 密鑰 產生偽隨機數填充補位區。<?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]";
| 特性 | XDeode | OpenSSL AES | Hashids |
|---|---|---|---|
| 輸入類型 | 純數字 | 任意二進制 | 純數字/陣列 |
| 輸出定長 | ✅ 可配置 | ❌ 隨輸入變化 | ✅ 可配置最小長度 |
| 字符集 | 字母數字 | Base64/十六進制 | 字母數字 |
| 依賴 | 零 | OpenSSL 擴展 | Composer 套件 |
| 安全性 | 混淆級(非加密級) | 加密級 | 混淆級 |
若需更高安全性,請改用 openssl_encrypt() (AES-256-GCM) + Base64UrlEncode,並妥善管理金鑰輪換。本類定位為「輕量級數字混淆」,在中小型項目中極具性價比。