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

PHP 字串編碼與加密:base64_encode、urlencode、sha1 實戰應用指南

     編輯:PHP 相關知識

前言

base64_encode、urlencode、sha1 是 PHP 開發中最高頻的三種字串處理函數,但常被混淆使用。本文釐清三者定位、編碼原理、適用場景與組合技巧,避免「加密」與「編碼」概念不清導致的安全漏洞。

函數定位速查表

函數類別可逆性主要用途輸出特徵
base64_encode()編碼可逆二進位資料安全傳輸(JSON、Cookie、Header、資料庫 Blob 儲存)A-Z a-z 0-9 + / =,長度約原始 4/3
urlencode()編碼可逆URL 查詢字串參數編碼、表單 POST application/x-www-form-urlencoded%XX 格式,空格→+
sha1()雜湊不可逆完整性驗證、簽名、密碼雜湊(建議改用 password_hash)40 字元十六進制

核心用法範例

1. Base64:二進位/中文安全傳輸

<?php
$original = '中文測試😀'; // 含 Unicode
$encoded  = base64_encode($original); // 5b6u5L+h5rWL6K+V77yB
$decoded  = base64_decode($encoded);  // 還原完美

// 實戰:API Token 組合
$payload = json_encode(['uid' => 123, 'exp' => time()+3600]);
$token   = base64_encode($payload); // 可放入 Header/URL 無特殊字元風險
?>

2. URL Encode:查詢字串安全構建

<?php
$params = [
    'keyword' => 'PHP & MySQL',
    'callback' => 'https://example.com/notify?type=order',
];
$query = http_build_query($params); // 內部自動 urlencode
// keyword=PHP+%26+MySQL&callback=https%3A%2F%2Fexample.com%2Fnotify%3Ftype%3Dorder

// 手動組裝時
$url = 'https://api.example.com/search?' . http_build_query($params);
?>

3. SHA1:完整性簽名(非密碼儲存)

<?php
$data = 'order_id=1001&amount=99.9&secret_key=MY_SECRET';
$sign = sha1($data); // 249ba36000029bbe97499c03db5a9001f6b734ec

// 驗證端重新計算比對,防範竄改
?>

組合拳:編碼鏈實戰

<?php
$raw = 'user=admin&role=super';

// 1. SHA1 產生簽名
$sign = sha1($raw . $secret_key);

// 2. 組合 payload
$payload = $raw . '&sign=' . $sign;

// 3. Base64 編碼整體(含特殊字元)
$token = base64_encode($payload);
// dXNlcj1hZG1pbiZyb2xlPXN1cGVyJnNpZ249MmQ5YmEzNjAwMDAyOWJiZTk3NDk5YzAzZGI1YTkwMDFmNmI3MzRlYw==

// 4. URL Encode 放入 Query String(若 token 含 + / =)
$url = 'https://api.example.com/auto_login?token=' . urlencode($token);
?>

常見誤區與避坑指南

  1. 誤以為 Base64/SHA1 是加密:Base64 公開演算法零保密性;SHA1 為單向雜湊,非加密。機敏資料必須用 openssl_encrypt() (AES) 或 sodium_crypto_secretbox()。
  2. 密碼儲存用 SHA1/MD5:嚴禁。請使用 password_hash($pwd, PASSWORD_DEFAULT)(BCrypt/Argon2),驗證用 password_verify()。
  3. 手動拼接 URL 參數忘記 urlencode:導致 & = 截斷參數。統一使用 http_build_query()。
  4. Base64 放入 URL 未二次 urlencode:Base64 可能含 + / =,在 URL 中會被誤解析。傳輸前務必 urlencode(base64_encode($data))。

總結

  • 傳輸編碼:Base64(Header/Body)、URL Encode(Query String)。
  • 完整性驗證:SHA1/HMAC-SHA256(簽名)。
  • 機密資料:對稱加密(AES-GCM/ChaCha20-Poly1305)。
  • 密碼:password_hash() + password_verify()。

分清「編碼、雜湊、加密」三大類別,才能在正確場景選用正確工具,寫出安全可維護的程式碼。

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