編碼、加工、加密的區別

base64編碼, 再套上額外的加工處理, 就會變成加密嗎?

不會。不論你疊加多少層處理,只要沒有「金鑰(Key)」的參與,它永遠只是「編碼」,而不是「加密」。

這是一個非常經典的資訊安全觀念誤區。讓我們來拆解一下為什麼「加工過的 Base64」依然不等於加密:


1. 編碼 (Encoding) vs. 加密 (Encryption)

特性編碼 (如 Base64)加密 (如 AES, RSA)
目的資料格式轉換(確保傳輸不亂碼)保護資料內容(防止未經授權讀取)
安全性。任何人都能還原。必須有「金鑰」才能還原
演算法公開且固定的邏輯基於數學難題與隱私金鑰
隱藏性只是換個樣子,內容仍是公開的沒有金鑰,內容看起來像隨機雜訊

2. 為什麼「額外加工」不等於加密?

如果你把 Base64 編碼後的字串拿去翻轉、平移(凱撒密碼)、或是把特定的字元換掉,這在密碼學中稱為 「隱寫術」或「模糊化」(Obfuscation),而非真正的加密。

  • 安全依賴於「秘密演算法」: 這種做法的安全性建立在「對方不知道你做了什麼處理」。但在密碼學中,這違反了 柯克霍夫原則(Kerckhoffs’s principle):一個系統的安全性應該建立在「金鑰」的保密上,而不是「演算法」的保密上。
  • 容易被破解: 對於現代電腦或資安人員來說,透過統計分析(頻率分析)或觀察規律,這種「加工」後的邏輯很快就會被識破。一旦邏輯被發現,你所有的資料就門戶大開了。

3. 什麼才叫「加密」?

真正的加密必須包含一個核心元素:金鑰 (Key)

C = E(K, P)

在這個公式中:

  • P 是明文 (Plaintext)
  • K 是金鑰 (Key)
  • E 是加密演算法 (Encryption Algorithm)
  • C 是密文 (Ciphertext)

即使全世界都知道你用了 AES 演算法(E),只要他們拿不到你的金鑰(K),他們就絕對無法算出原本的內容。而 Base64 的加工處理通常不涉及金鑰,它只是一個 f(x) 的變換過程而已。


4. 什麼時候會把它們放在一起用?

在實際開發中,我們確實常看到它們同時出現,但順序通常是:

  1. 加密: 先用 AES 或 RSA 把資料加密成二進位亂碼。
  2. 編碼: 因為加密後的亂碼在 HTTP 傳輸或資料庫儲存時容易出錯,所以我們會用 Base64 把這串亂碼轉成純文字格式。

小結:

Base64 是「換衣服」(換個樣子),加工處理是「把衣服反過來穿」。

只有加密才是把資料鎖進「保險箱」。

如果你需要保護敏感資料(如密碼、個資),請務必使用標準的加密函式庫(AES, ChaCha20 等),千萬不要依賴自創的 Base64 變形。


有沒有方法支援單一字元加密, 還可以支援 sql command like ‘%keyword%’ 查詢?

這是一個在資安與資料庫效能之間非常經典的兩難問題。

通常情況下,「加密」與「模糊查詢(LIKE)」是互斥的。因為加密的本質是為了消除資料的統計規律(讓輸出看起來像隨機亂碼),而 LIKE '%keyword%' 的本質則是尋找特定的規律。

不過,實務上確實有一些折衷方案或進階技術可以達成你的需求:


1. 同態加密 (Homomorphic Encryption)

這是數學上最完美的解法,允許你在加密後的資料上直接進行運算或搜尋,而不需要解密。

  • 優點: 極致安全,資料在伺服器端永遠是加密狀態。
  • 缺點: 效能極差。目前處理單一字元或字串搜尋的計算成本太高,不適合用於一般高頻率查詢的 Web 系統。

2. 確定性加密 (Deterministic Encryption)

普通的加密(如帶有隨機 Salt 的 AES)會導致同樣的「A」每次加密結果都不同。而「確定性加密」確保同樣的字元永遠加密成同樣的密文。

  • 做法: 如果你將每個字元獨立加密(例如:A $\rightarrow$ x8!, B $\rightarrow$ q2@)。
  • 搜尋: LIKE '%ABC%' 就會變成 LIKE '%x8!q2@...%'
  • 缺點(致命傷): 易受頻率分析攻擊。如果駭客知道你這是單一字元加密,他們只要統計哪個密文出現最多次,就能猜出那是「e」或「空格」,安全性與 Base64 加工差不了多少。

3. 可搜尋加密 (Searchable Encryption) 與 盲索引 (Blind Index)

這是目前業界(如 Signal 或一些金融系統)較推薦的實務做法。我們不直接在加密欄位上 LIKE,而是額外建立一個輔助用的索引欄位

實作方式:n-gram 盲索引

  1. 拆分: 將字串拆解成小單位(例如每兩個字一組,稱為 Bigram)。例如 “APPLE” 拆成 AP, PP, PL, LE
  2. 雜湊 (Hash): 將這些小單位透過 HMAC(帶金鑰的雜湊)轉成不可逆的代碼。
  3. 儲存: 把這些代碼存入一個專門用來搜尋的關聯表。
  4. 查詢: 當使用者搜 “PP” 時,系統先將 “PP” 轉成同樣的 HMAC 代碼,再去索引表裡面找對應的原始資料 ID。
原始資料加密欄位 (AES)盲索引欄位 (HMACs)
APPLE0xAF23...hash(AP), hash(PP), hash(PL)...

4. 數據遮罩與代碼化 (Tokenization)

如果你的需求是針對特定格式(如身份證字號、信用卡),可以使用「格式保留加密 (FPE)」。

  • 特性: 加密後的長度與格式不變。
  • 搜尋: 雖然可以支援部分查詢,但通常僅限於「前綴」或「後綴」,對於 LIKE '%中間內容%' 依然吃力。

總結建議

如果你需要 「高安全性」「支援 SQL LIKE」

  1. 最簡單但較不安全: 使用確定性加密,但不要逐字加密,而是逐詞或針對整個欄位,這僅能支援「完全符合」的查詢。
  2. 標準專業作法: 建立 Blind Index (盲索引)。將常用的搜尋關鍵字(或 n-grams)經過 HMAC 處理後存入獨立欄位。
  3. 小數據量方案: 如果資料只有幾千條,最省事的方法是 「拉到記憶體裡處理」:全部撈出來在應用層解密後再篩選(但資料量大時會造成崩潰)。

關鍵提醒: > 「單一字元加密」是非常危險的作法,因為它的熵(Entropy)太低,在現代運算能力下幾乎等同於明文。

你目前的資料量級大約是多少?這會決定哪種方案最適合你。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *