磁碟全盤加密技術,如果只說用TPM的話,我個人感覺還是不能說明問題的。網上關於TPM的介紹大多數都是重複的那幾句話,並沒有介紹TPM到底以什麼樣的方式工作的。
比如使用者是可以改密碼的,但是改密碼並沒有影響bitlocker的運行,改密碼是瞬間完成的,說明改密碼不影響加密結果。
絕大多數全盤加密的軟體實現裡(包括並不限於:bitlocker,trueCrypt,安卓的全盤加密等等),需要解決的兩個最重要的問題是:
1. 加密解密性能要足夠快。
2. 用戶可以隨意改密碼,這個改密碼的過程必須立即生效,而不是重新解密、加密所有數據。
注:本文中提到的盤,一般指的是分區,而非物理的整個盤,雖然很多軟體也支援物理全盤加密,但通常情況下,加密都是針對分區層面的。
對於第一條,也就是性能問題,絕大多數加密演算法,都使用對稱加密演算法(比如AES-128/256),因為非對稱演算法的計算量太大,不能滿足日常需求。磁碟加密演算法,一般情況下使用的是AES-XTS或者它的變種,AES演算法有ECB、CBC、XTS等若干變種:
ECB:把數據拆分成若干組,每一組獨立加密、解密,這種演算法有一個缺陷,就是當有駭客獲取了足夠多的樣本以後,是有可能暴力破解的,因為只要是同樣的數據內容,ECB加密的結果一定是相同的。
CBC:把數據拆分成若干組,使用一個初始化向量(IV),前面每一組的數據加密完以後,都會產生一個新的值,簡單的說就是把前面一組的數據的加密結果,作為後面一組數據加密的一部分輸入,這樣的好處就是即使駭客截取了足夠多的樣本數據,破解起來難度仍然很大,因為即使是同樣的內容,在數據流的位置不同,加密后的結果也不同。網路傳輸加密經常使用這種演算法。
XTS:因為CBC演算法裡,後面的數據解密的時候,需要依賴前面的解密結果,這就意味著要解密第N塊數據,就需要解密前面1到N-1塊的數據,但是磁碟數據都是一塊一塊獨立的,不可能一次性把整個磁碟上GB/TB的數據都解開(性能也不允許),所以XTS是加入了一個Tweak key的概念,Tweak key可以是扇區號(或者類似的概念),這樣就可以相對獨立的加密每一個扇區塊,又保證即使扇區內容相同,加密後的內容也不同(因為扇區號不同,Tweak key不同)。
解決了性能的問題,剩下的就是要解決使用者改密碼的問題。如果直接使用用戶的密碼加密,那麼如果使用者改密碼,就需要全盤數據全部解密、再加密,對於整盤數據來說,這樣的效率是不允許的。所以針對全盤數據加密解密,通常使用二級(或者多級)密碼實現的。
當要啟動整盤加密時,生成一個隨機的,超長的秘鑰,有些地方叫做master key,這個master key是用來直接給數據加密解密的(用於AES-128/256)。但是這個秘鑰太長了(128/256位二進位數),而且也不能更改(更改了就要全盤解密),使用者提供的密碼,是用於加密這個master key的,這個過程使用的一般是非對稱加密技術(比如RSA等),相當於使用者輸入密碼以後,通過非對稱加密演算法,解開真正的master key,然後再用master key解密真正的數據。不管用戶怎麼修改密碼,這個master key是不改變的。
TPM這類安全外設,就是保存這個master key的。master key不在盤上,而在外設里。
講到這裡,細心的人會發現:master key既然是存在TPM外設里,那麼就可能有這些問題:
1. 既然master key在TPM里,TPM怎麼保證不被第三方工具讀取,為什麼TPM只認Windows?
2. master key從TPM傳輸給操作系統時是否會被截取?
3. master key在記憶體中是否能被其他惡意軟體截獲?
一條一條解釋:
1. 既然master key在TPM里,TPM怎麼保證不被第三方工具讀取,為什麼TPM只認Windows?
顯然如果TPM是一個U盤之類的可以被任何人訪問的東西,那麼它必然是存在被破解的可能的。TPM之所以叫Trusted Platform Module,是因為它在存儲秘鑰的過程中,使用了一系列的安全手段,比如要校驗作業系統的證書。
所以Linux上想要直接使用TPM作為安全認證很麻煩,因為大多數TPM只信任“安全”的證書,對於Linux來說,自己編譯的內核是沒辦法簽發讓TPM信任的證書的。TPM只信任它認為“安全”的作業系統,這個操作系統只有Windows這類二進位發佈的,帶有證書校驗的作業系統。自己隨便編譯的Linux內核是無法讀取TPM的內容的。
2. master key從TPM傳輸給操作系統時是否會被截取?
前面提到了TPM的通信過程中要做證書校驗,這個過程使用了非對稱加密演算法,TPM返回給操作系統的master key是經過加密的,這個過程跟HTTPS/SSL的通信過程類似,建立通信之前,雙方要校驗證書(把Windows當成HTTPS伺服器,TPM是瀏覽器用戶端),之後雙方通信的內容會使用證書加密。這樣即使有人能把TPM的物理信號截取出來,也無法直接獲取master key的內容(它是加密過的),解開master key的秘鑰只有Windows自己才有。
3. master key在記憶體中是否能被其他惡意軟體截獲?
這種風險是存在的,因為操作系統要解密,必然是要把master key保存到記憶體的某個地方,然後調用AES演算法進行解密的。早期的bitlocker版本里,確實有攻擊者可以通過某些手段攻擊到內核中,然後在特定的記憶體位置找到AES的秘鑰。
對於這種攻擊手段,微軟在Windows 10里提供了內核DMA保護的技術來阻止這種攻擊。
當然,現在還有其它攻擊方案,比如“冷啟動攻擊”:計算機在關機以後,記憶體中的內容並不會立即消失,通常會有幾秒甚至幾分鐘的延遲,如果黑客可以在Windows關機以後獲得硬體控制權,然後直接把記憶體中的數據全部複製出來,還是能找到master key的。應對冷啟動攻擊的辦法也有很多,比如在操作系統關機之前,把所有master key的記憶體全部寫0x55/aa幾次。但是由於記憶體中的數據很多,操作系統要百分百保證數據安全還是有困難的。
微軟的bitlocker有沒有別的安全漏洞??
我能想到的,有很多,比如:
1. master key在伺服器的安全性問題:
磁碟加密的master key,其實就是微軟伺服器上保存的那個恢復秘鑰ID,微軟為了防止使用者忘記密碼,在啟動bitlocker的時候,會把master key保存一份。所以如果自己的微軟帳戶洩漏了,那麼別人也是有辦法通過微軟帳戶來獲取master key。
所以有很多大公司,並不使用微軟的伺服器來保存master key,而是自建一個域伺服器來存儲。這樣哪怕微軟那邊出了什麼問題(比如,被美國政府控制),那麼微軟也無法拿到master key。
2. AES-XTS自身的安全問題:
因為AES是分組加密,數據是被分成一塊一塊的,那麼如果原始數據內容相同,加密后的數據也是相同的,為了避免這種安全問題,磁碟加密使用的是XTS,也就是使用一個類似塊編號的方法,把塊編號本身作為加密的一部分輸入。
但這裡還有一個問題:XTS的Tweak key是通常是扇區位址,而一個扇區的大小遠遠大於AES的加密數據單元(一組數據是16/32位元組),那麼就意味一個扇區內的所有數據使用的tweak key是相同的,那麼如果扇區內有重複的數據,AES-XTS也會生成重複的內容。對於目前4K的大扇區來說,這種安全隱患不容忽視。
微軟曾經在早期的bitlocker中使用了擴散器的機制(elephant diffuser),讓扇區內的所有數據產生關聯性,也就是說,如果扇區內的第一組AES數據發生了改變,那麼這個改變會影響整個扇區內所有組AES數據的加密結果。但是這個機制因為性能問題被移除了,所以這是一個AES-XTS的安全漏洞,如果AES分組大小不變的情況下,大扇區的存儲介質,安全隱患會更大一些。雖然AES-XTS演算法本身已經足夠安全了,但是道高一尺魔高一丈,任何安全漏洞都不應該忽視。