🎯 什麼情境該想到我
當你「要保護敏感資料,得決定用哪一類加密、以及那把金鑰到底該放哪裡」的時候。
⚙️ 怎麼用(步驟 / 公式)
-
先問「明文有沒有偷偷躺在某處」。2011 年 12 月被曝的 CSDN 密碼洩漏事故,網站安全措施不力導致使用者資料庫被駭客「拖庫」並不稀奇,令人錯愕的是資料庫中的使用者密碼竟然是明文保存,導致密碼洩漏、成為地下黑市交易的商品。動手加密前,先把所有明文落地點盤一遍。
-
選加密類型。書中把資訊加密技術分成三類:
- 單向散列加密:對不同輸入長度的資訊做散列計算,得到固定長度的輸出,過程是單向的——不能從固定長度的輸出反算回輸入。
- 對稱加密:加密和解密使用的是同一把金鑰(或可互相推算)。
- 非對稱加密:加解密用的不是同一把金鑰,一把對外公開叫公鑰,另一把只有所有者知道叫私鑰;公鑰加密的只有私鑰能解,反之亦然。理論上不可能由公鑰計算得到私鑰。
-
密碼保存用單向散列。使用者註冊時輸入的密碼不直接存進資料庫,而是先做單向散列加密、把密文存入資料庫;登入時同樣算出輸入密碼的密文,與資料庫中的密文比較,一致才驗證成功。這樣即使資料庫被「拖庫」也不會洩漏密碼資訊。
- 一定要加鹽(salt):雖然不能用演算法把散列密文反算成明文,但人們設定密碼有一定模式,透過彩虹表(常用密碼與對應密文的關係表)等手段可以做猜測式破解。加 salt 相當於加密的金鑰,增加破解難度。
- 常用單向散列演算法:MD5、SHA。
- 附帶特性:輸入的任何微小變化都會導致輸出完全不同——因此也用來產生資訊摘要、計算高離散程度的隨機數。
-
大量資料加密用對稱加密。常用在資訊需要安全交換或儲存的場合,如 Cookie 加密、通訊加密。
- 優點:演算法簡單、加解密效率高、系統開銷小,適合對大量資料加密。
- 缺點:加解密同一把金鑰,遠端通訊時如何安全交換金鑰是個難題;金鑰一旦遺失,所有加密資訊也就無密可言。
- 常用演算法:DES、RC。書中稱對稱加密是傳統也是最常用的加密手段,適用於絕大多數需要加密的場合。
-
安全傳輸與數位簽章用非對稱加密,注意兩者方向相反:
- 安全傳輸:發送者 A 從公開渠道取得接收者 B 的公鑰加密,經非安全通道送出;B 用自己的私鑰解密。密文被竊取者拿到也還原不出明文。
- 數位簽章:簽名者用自己的私鑰加密後發出,接收方用簽名者的公鑰解密。由於私鑰只有簽名者擁有,該資訊不可抵賴,具有簽名性質。
- 常用演算法:RSA。HTTPS 傳輸中瀏覽器使用的數位憑證,實質上就是經權威機構認證的非對稱加密公鑰。
-
實務上混合使用:先用非對稱加密技術對對稱金鑰進行安全傳輸,再用對稱加密技術做資訊加解密與交換。有時對同一份資料兩次使用非對稱加密,可同時達成安全傳輸與數位簽章。
-
回頭管好金鑰——這才是前提。不管是散列的 salt、對稱加密的金鑰還是非對稱加密的私鑰,一旦洩漏,所有基於它加密的資訊都失去秘密性。書中直接點名的壞習慣:有的工程師把金鑰直接寫在原始碼中,稍好一點的寫在設定檔中,線上與開發環境用不同金鑰——但金鑰本身仍以明文保存,而且很多人接觸得到,至少在公司內部金鑰不是秘密。
-
兩種改善方案,二選一:
- (a) 金鑰與演算法都獨立部署:放在一台獨立伺服器上,甚至做成專用硬體設施,對外提供加解密服務,應用系統呼叫這個服務完成加解密。由專人維護,金鑰洩漏機率大大降低。缺點:成本較高、有可能成為應用的瓶頸、每次加解密都要一次遠端服務呼叫,系統效能開銷也較大。
- (b) 演算法留在應用系統、金鑰放獨立伺服器:兼顧安全性與效能。實際儲存時,金鑰被切分成數片,加密後分別保存在不同儲存介質中。應用程式呼叫加解密服務介面,介面向密鑰伺服器的密鑰服務取得金鑰並在本地快取(定時更新);密鑰伺服器的金鑰則來自多台密鑰儲存伺服器,每台都有專人負責管理。密鑰申請者、密鑰管理者、安全稽核人員透過密鑰管理控制台管理更新金鑰,每個人各司其職,沒有人能查看完整的密鑰資訊。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 單向散列不可逆,只能用來驗證、不能用來取回。要能還原原始資料的場合(Cookie 內容、通訊內容)得用對稱或非對稱加密。
- 只加密不管金鑰等於沒加密。書中明說,前述幾種加密技術能達到保密效果的重要前提就是金鑰的安全。
- 獨立加解密服務會變成瓶頸:每次加解密都是一次遠端呼叫,高併發路徑上要先評估開銷;書中方案 (b) 就是為此而生。
- 非對稱加密不適合拿來加密大量資料:書中的定位是資訊安全傳輸與數位簽章,大量資料交給對稱加密。
🔗 相關工具
- 工具-網站應用攻擊與防禦 —— 同一章的另一半:擋住 XSS/注入等攻擊,加密則是攻擊得手後的最後一道防線
- 工具-反垃圾與電商風控 —— 同一章的內容安全與交易安全篇
- 工具-資安與合規左移 —— 把「金鑰不能寫在程式碼裡」這類要求提前到開發流程前段
- 工具-金鑰地址與錢包 —— 公私鑰的另一個應用場景:私鑰即所有權
- 工具-防禦式編程 —— 不信任外部輸入的同一種心態,往下延伸到不信任儲存層
- 大型網站技術架構 —— 來源書