AES-256-GCM 與 600,000 次 PBKDF2 運算說明
照片保險箱功能清單上的那些數字實際代表什麼,以及誠實說明它們涵蓋不到的部分。
AES-256-GCM 是使用 256 位元金鑰的 AES 加密方法,以一種稱為 GCM 的方式使用。GCM 這部分值得留意:它不只打亂資料,還會檢查資料,所以被竄改過的檔案會打不開,而不是悄悄回傳錯誤內容。600,000 次 PBKDF2 運算會刻意緩慢地把你的密碼轉成金鑰,讓攻擊者每猜一次都要付出 600,000 次運算的成本。這個數字是 OWASP 公開的建議,不是我們訂的。
這些都無法應付保險箱開啟時遭到入侵的手機,也無法應付別人已經知道的密碼。詳細內容和限制如下。
照片保險箱的功能清單上滿是數字:AES-256、GCM、600,000 次運算、PBKDF2。它們被印得好像能一錘定音,大多數讀者也很合理地直接跳過。其實它們值得你花十分鐘。知道每一項的作用,你就能分辨具體的說法和只是聽起來厲害的說法。本頁用淺白的話逐一解釋這些名詞,然後在第 8 節說明加密防範不了什麼。真正會改變你決定的,是第二部分。
1. 精簡版
| 名詞 | 作用 |
|---|---|
| AES | 加密方法。一種用金鑰打亂資料的公開標準。 |
| 256 | 金鑰大小,單位是位元。大到逐一嘗試每把金鑰並不實際。 |
| GCM | 使用 AES 的一種方式,同時檢查有沒有被竄改。被改動的資料會被發現,而不是悄悄被接受。 |
| Nonce | 每次加密只用一次的數字。同一把金鑰絕不能重複使用它。 |
| PBKDF2 | 把密碼轉成金鑰的過程,刻意放慢。 |
| 600,000 次運算 | 放慢的程度。攻擊者每猜一次,就要付出 600,000 次運算的成本。 |
| 鹽值(salt) | 混入的隨機資料,讓攻擊者無法事先準備答案,再拿去套用在所有使用者身上。 |
2. AES-256 是什麼
AES 是 Advanced Encryption Standard(進階加密標準)的縮寫。它是美國國家標準與技術研究院(NIST)在一場持續數年的公開競賽後,於 2001 年公布的加密方法。它不是祕密,也不屬於任何人。設計完全公開。大學和業界的專家研究它已超過二十年,沒有找到實際可行的方法破解完整的演算法。
256 是金鑰的位元數。要嘗試這個大小的所有金鑰,等於要搜尋 2 的 256 次方種可能。這不是等電腦變快就能解決的問題,而是遠遠超出一般電腦所能達到的範圍。實際上,這就是為什麼加密方法本身幾乎從來不是出問題的地方。
正因如此,「我們使用 AES-256」能告訴你的比看起來少。這差不多只是最低標準。真正值得問的是:加密了什麼、怎麼使用,以及金鑰是怎麼產生的。
3. GCM 多了什麼
加密本身能讓資料保密:沒有金鑰就讀不了。但它本身並不保證資料完好無缺,也無法告訴你,你打開的就是當初放進去的東西。
這個缺口是真實存在的。如果方法不做檢查,能修改儲存檔案的人就能改動被打亂的資料。打開時會得到不同的錯誤資料,而且不會出現任何錯誤訊息。你拿回了資料,只是那不是當初放進去的資料,而且沒有任何東西提醒你。
GCM 加上了這項檢查。它會在打亂的資料旁邊產生一個檢查值,每次打開資料時都會驗證這個值。摘自我們自己的安全性白皮書:
「磁碟上只要有一個位元組被修改,解密就會明確失敗,而不是回傳細微錯誤的明文。正因如此,『已解密』就等同於『自加密後未被修改』。」
這是在功能清單中最值得留意的一點,因為精確與否就看在這裡。「AES-256」說出的是一種方法。「AES-256-GCM」說出的是方法加上使用方式,而防竄改檢查存不存在,就取決於使用方式。
4. Nonce,以及最經典的錯誤
GCM 系統中的每次加密都會用到一個 nonce,意思是只使用一次的數字。它不需要保密,但對同一把金鑰來說必須是唯一的。
只要在同一把金鑰下重複使用 nonce,GCM 的保護就會嚴重失效。這不是罕見的特例,而是使用 GCM 的真實系統最常被攻破的方式,起因是實作時的偷懶捷徑,而不是 AES 有任何弱點。
有兩種可靠的方法能確保它永不重複。一種是每次加密都用全新的隨機數。Obscura Photo Vault 對單一檔案就是這樣做:每次一個新的 96 位元隨機數,搭配 128 位元的檢查值。另一種是可證明永不重複的計數器,我們處理大型影片的格式就是用這種:它把每個檔案各自選定的隨機數和區塊編號結合起來,所以任何檔案中都不會有兩個區塊共用同一個 nonce。
兩種做法沒有哪一種比較正確。重要的是 App 是刻意選擇了其中一種。這正是公開的設計文件能呈現、而功能清單無法呈現的東西。
5. 你的密碼才是弱點
256 位元的金鑰有 256 位元的隨機性,你的密碼可沒有。即使是好的密碼片語,大概也只有 60 到 80 位元,一般密碼則少得多。如果直接把密碼當成金鑰,再大的金鑰也沒有意義,因為攻擊者會去猜密碼,而不是猜金鑰。
把密碼轉成金鑰的過程就是兩者之間的橋梁。PBKDF2 會拿密碼和鹽值,反覆用一個打亂函式處理固定的次數,最後產生金鑰。反覆處理的目的就是成本。你每次解鎖只產生一次金鑰,這一秒左右的時間你幾乎不會察覺。攻擊者測試幾百萬次猜測,每一次都要付出這個成本。
這就是你該找的數字,也是最常被省略的數字。一款 App 可以誠實地說它使用 AES-256,卻只用一個步驟就把你的密碼轉成金鑰。這樣一來,它就正好暴露在這個過程原本要防範的離線猜測攻擊之下。
6. 為什麼是 600,000
這個數字不是隨便選的,也不是我們訂的。OWASP Password Storage Cheat Sheet 是這方面最廣為使用的公開參考資料,它建議使用 HMAC-SHA-256 的 PBKDF2,運算次數至少 600,000 次。Obscura Photo Vault 的保險箱密碼用的就是這個次數。
有兩點需要誠實補充。
這個標準會變動。硬體越來越快,建議的運算次數也跟著提高。目前的數字是以現今的顯示晶片測試得出的。幾年前還夠用的數字,現在已經不夠,今天的數字也不會永遠夠用。請把公布的運算次數視為一個附有日期的說法。
它會放大你的密碼強度,但不能取代密碼。運算次數讓每次猜測的成本高出許多,但不會改變需要猜幾次。從少數選項中挑出的密碼,經過 600,000 次運算後依然很弱,因為攻擊者只要試完那一小組選項就好。這個過程爭取到的時間,和你的密碼原本有多難猜成正比。
所以,任何加密保險箱的實用建議都很無聊,但很正確:使用由不相關的詞組成的長密碼片語,並寫下來放在安全的地方。如果 App 的金鑰真的是由你的密碼產生,那份寫下來的紀錄就是唯一的備份。這正是我們另一篇指南忘記保險箱密碼會怎樣的主題。
7. 鹽值
鹽值(salt)是在密碼轉成金鑰之前混進去的隨機資料。它和加密資料存放在一起,不是祕密,也不需要保密。
它的作用是阻止攻擊者事先準備。沒有鹽值的話,攻擊者可以先把一份常用密碼清單的金鑰算好一次,再拿這份清單去對付某款 App 的所有使用者。每個保險箱都有獨一無二的隨機鹽值時,這些工作就必須針對每個目標從頭再做一次,在不同使用者之間共用成果就不再可能。
Obscura Photo Vault 為每個保險箱使用 32 位元組的隨機鹽值,存放在保險箱檔案本身的標頭中。
8. 這些都防範不了什麼
以上說的都是靜態資料:存放在儲存空間裡、沒有被使用的檔案。這是真實而有用的保護,但範圍也很窄。我們的安全性白皮書第 11 節列出了不在保護範圍內的情況。用淺白的話說:
- 保險箱開啟時遭到入侵的手機。要讓你看到照片,App 必須先把它解開。所以金鑰和可讀取的照片都在記憶體裡,當下在 App 內執行的任何東西都能取得兩者。沒有任何 App 層級的加密能修好一支已被入侵的手機。
- 任何知道你密碼的人。加密分辨不出眼前是密碼的主人,還是看過主人輸入、或被告知密碼的人。
- 截圖、螢幕錄影和偷看螢幕。螢幕上顯示的內容已經解開了,這不在加密涵蓋的範圍內。
- 你在其他地方留下的副本。仍在相機膠卷裡的原始檔、你透過訊息傳出去的版本、搬移之前就做好的雲端備份。加密其中一份副本,對其他副本毫無作用。
- 這款 App 存在的事實。加密能隱藏內容,但無法隱藏「有東西要藏」這件事。
之所以在一個主要介紹這些基礎元件有多好的頁面上說這些,是因為:在真實的失敗案例中,出錯的幾乎從來不是加密方法,通常是上面五項之一。
9. 關於「軍事等級」
這個說法沒有任何技術上的意義。它通常指的是 AES,而 AES 是任何人都能使用的公開標準,並非軍方專用。每個主流作業系統、瀏覽器和通訊 App 都在使用它。
問題不在於這個說法是假的,而在於它什麼也沒承諾。它沒有指出方法、使用方式、金鑰大小,也沒有說明如何把密碼轉成金鑰。所以,把每個檔案都加密的 App 可以誠實地這樣說,只加密設定的 App 也可以。
這不是在抱怨這個說法本身。頁面可以使用它,同時仍然告訴你一些實在的資訊。讓一項說法對想要查證的人有用的,是後面接著說的東西:方法、模式、金鑰產生過程、運算次數,以及涵蓋的範圍。只停在這個說法的頁面什麼也沒承諾;接著說出這些細節的頁面,不論開頭怎麼寫,都可以查證。
10. 常見問題
AES-256-GCM 是什麼意思?
AES 是一種公開的加密方法。AES-256 是使用 256 位元金鑰的版本。GCM 是使用它的一種方式,同時會檢查資料有沒有被竄改。在日常使用中,最重要的就是這項檢查:被改動過的檔案會打不開,而不是悄悄打開成錯誤的資料。
AES-256 和 AES-256-GCM 有什麼不同?
後者不只說出了方法,也說出了使用方法的方式。GCM 多了一道防竄改檢查,所以被改動過的資料會在你打開時被發現,而不是默默回傳錯誤內容。
照片保險箱 App 為什麼要用 600,000 次 PBKDF2 運算?
密碼很短,也猜得到;加密金鑰則不然。所以密碼必須經過一個刻意放慢的過程,才能變成金鑰。每多一次運算,攻擊者每猜一次就要多做一份工。600,000 次是 OWASP Password Storage Cheat Sheet 針對這種方法(使用 HMAC-SHA-256 的 PBKDF2)建議的次數。
AES-256 加密安全嗎?
AES-256 是公開標準。專家研究它已超過二十年,沒有找到實際可行的方法破解完整的演算法。在真實的 App 裡,弱點很少出在這個方法本身。使用方式出錯、密碼容易猜到,或有人在手機解鎖時拿到手機,這些都是更可能發生的問題。
AES-256 比 AES-128 好嗎?
金鑰越大,安全餘裕越多。以今天的方法和硬體,兩者都被認為足以抵擋逐一嘗試所有金鑰的攻擊。實際上,選哪一個幾乎不會決定一款 App 撐不撐得住。
「軍事等級加密」是什麼意思?
它沒有任何技術上的意義。通常指的是 AES,而 AES 是任何人都能使用的公開標準,並非軍方專用。因為這個說法沒有指出方法、模式或金鑰大小,所以把所有東西都加密的 App 可以這樣說,幾乎什麼都沒加密的 App 也可以。
量子電腦能破解 AES-256 嗎?
已知的量子捷徑 Grover 演算法,大約會讓這類金鑰的強度減半。對 256 位元金鑰來說,這仍留有非常大的餘裕。這也是 256 位元金鑰被視為合理長期選擇的原因之一。用於在網路上交換金鑰的那類加密,面臨的量子問題比 AES 大得多。
600,000 次運算會讓解鎖變慢嗎?
在新款 iPhone 上,每次解鎖大約需要一秒。重點就在這種不對等:做一次幾乎感覺不到,做幾百萬次就會拖垮攻擊者。
運算次數越多,就可以用比較弱的密碼嗎?
不行,這是最常見的誤解。運算次數越多,每猜一次的成本越高,但弱密碼需要猜的次數並不會因此減少。短密碼依然很弱。
資料來源
- OWASP Password Storage Cheat Sheet,關於 PBKDF2 的運算成本
- NIST FIPS 197,進階加密標準(Advanced Encryption Standard)
- Obscura Photo Vault 安全性白皮書,第 2 到 4 節,關於基礎元件與金鑰階層
- 安全性白皮書第 11 節,關於不在威脅模型範圍內的情況
Obscura Photo Vault
iPhone 上的加密照片保險箱。照片和影片會在你的裝置上以 AES-256-GCM 加密。沒有帳號、沒有伺服器、沒有分析工具,App 也不需要網路連線。如果你忘記密碼,沒有人能回復裡面的內容,包括我們。
在 App Store 查看 →