Obfuscation
Obfuscation 的核心概念是讓內容不以明文出現,抵擋的對象是不特定的旁觀者。它與加密的分界由還原內容所需的金鑰放在哪裡決定:金鑰隨程式一起發佈時,任何取得程式的人都能還原,這個機制提供的是混淆;金鑰只在服務端時,提供的才是機密性(見 At-Rest Encryption)。演算法強度在這條分界上不起作用 —— 換成更強的演算法,金鑰仍在客戶端時能擋住的對象沒有改變。
概念位置
可逆性把它與 Data Masking 分開:遮罩不可逆,目的是讓不該看到完整值的人看到部分值;混淆可逆,目的是讓內容在載體上不以明文出現,持有金鑰的一方仍要還原出原值使用。兩者容易被混用,因為在螢幕上都表現為「看不到原值」。
在 Defense in Depth 的分層中它只能是外層,不能是唯一的一層。服務端的授權判斷擋得住洩漏後的濫用時,客戶端的混淆是額外一層;服務端沒有把關時,混淆承擔的責任超過它的能力。
可觀察訊號與例子
需要正視命名的訊號是團隊用「已加密」描述一段金鑰在客戶端的處理。這是強度誤稱——做的事沒錯,但把弱版本說成強版本,修法是移動金鑰的位置而非換演算法。命名一旦精確為混淆,設計討論會自動導向正確的問題:這段內容洩漏給「能取得程式的人」的後果可以接受嗎。
混淆失效的路徑都不需要特殊技術。產出物可被反編譯或字串掃描取出金鑰;攻擊者若知道編碼前的部分內容,與密文對應位置比對就能推導金鑰片段;同一把金鑰重複使用時,多份密文之間的統計特性足以還原。
適合使用的場景有共同形狀:載體會被不特定人看到、內容洩漏的後果可控、而且真正的授權判斷發生在別處。實體標籤上的識別碼、測試環境的受限帳號屬於這一類。
設計責任
設計時要在程式碼與文件裡明確標示這是混淆而非加密,並說明金鑰在客戶端這個事實。命名要讓呼叫端讀到名字就知道邊界,而不需要回頭查文件。
採用前要逐項確認條件成立,而非以「內容不重要」這個標籤代替檢查:列出該憑證的實際權限清單、實測服務端在憑證洩漏後還擋得住哪些操作、確認能產生這種載體的入口限制在受控環境。
判定條件不成立時,出路是把金鑰移出產出物而非換更強的演算法。金鑰仍在客戶端時,換演算法不改變威脅模型。