【可信计算】第十次课:TPM密码资源管理(二)
這一部分相對一第九次課,老師的PPT中多了密鑰相關的部分
- TPM的一個最強大的功能就是:應用程序可以把密鑰安全地保存在硬件設備中。TPM可以生成密鑰,也可以導入在外部生成的密鑰,它支持對稱和非對稱密鑰,因為TPM設備的存儲資源有限,應用程序經常需要安全地將密鑰換入換出TPM,這時TPM可以被認為是一個密鑰緩存。
- 密鑰可以被看作TPM中的一種實體,也可以看作是被專門定義的TPM對象。它通常作為組織架構中的核心組成部分出現,很多時候我們也可以稱上次課講到的三種組織架構為密鑰**組織架構。
- 包含密鑰的組織架構在訪問時會遇到相應的安全控制方式:包括口令、增強的授權策略、密鑰復制限制和密鑰用途限制。
密鑰使用命令
- TPM2_Create和TPM2_CreatePrimary可以通過模板創建所有類型的密鑰。
- TPM2_Load(用于加密的私鑰)和TPM2_LoadExternal(用于公鑰或者明文私鑰)可以將密鑰加載到TPM中。
- TPM2_ContextSave和TPM2_ContextLoad用于將密鑰換入換出TPM緩存。- TPM2_FlushContext用于刪除TPM中的密鑰。TPM2_EvictControl可以讓一個密鑰持續存在與TPM中或者刪除一個持續存在的密鑰。
- TPM2_Unseal,TPM2_RSA_Encrypt,和TPM2_RSA_Decrypt使用加密密鑰完成相關操作。
- TPM2_HMAC,TPM2_HMAC_Start,TPM2_SequenceUpdate,和TPM2_SequenceCompete使用對稱簽名密鑰和HMAC算法完成相關操作。
TPM2_Sign是一個通用的簽名命令,TPM2_VerifySignature用于驗證數字簽名。 - TPM2_Certify,TPM2_Quote,TPM2_GetSessionAuditDigest,TPM_GetTime是用于對認證數據簽名的特殊命令。具體來講,TPM2_Certify可以實現一個密鑰簽名另外一個密鑰(密鑰的名稱)。這樣一來,TPM就可以作為一個證書授權機構,使用自己的密鑰認證證書相關密鑰的屬性。
密鑰生成器
TPM最強大的能力是,它能產生密鑰并將相關的秘密信息安全地保存在硬件中。密鑰生成器基于TPM自己的隨機數發生器,它不依賴任何外部的隨機源。因此它消除了由較弱的軟件隨機數生成器或者不充足的熵值帶來的弱點。
為了保護對稱密鑰,TPM內部會形成一個天然的層次化組織架構,這也TPM可信計算中組織架構名稱的由來。在組織架構中,存在一個頂層父密鑰,即主密鑰,它們沒有父節點。
主密鑰和種子
主密鑰的創建命令使用易于理解的命名方式TPM2_CreatePrimary。TPM1.2中有一個和TPM2.0主密鑰相同的密鑰:根存儲密鑰(SRK),這個密鑰會一直存在于TPM中。TPM2.0中主種子控制主密鑰的生成,它允許有無限多個主密鑰,雖然這些主密鑰并不一定一直存在于 TPM中。這并不是因為TPM的永久性存儲空間有限,而是因為只要控制了種子,就可以重新生成主密鑰。
TPM1.2在只有一個密鑰的情況仍然可以工作的原因有兩個。首先,它只有一個密鑰算法和一個密鑰大小用于加密密鑰,那就是RSA-2048。然而TPM2.0中支持多種密鑰算法和多種密鑰大小。其次,TPM1.2只有一個密鑰組織架構:存儲組織架構。TPM2.0有三種組織架構,每一種都至少有一個根節點。
主密鑰種子
TPM利用主密鑰種子實現有限的非易失性存儲空間支持數量不限的根密鑰。
三個組織架構的每一個都和一個主密鑰種子關聯,分別是:背書主密鑰種子,平臺主密鑰種子,和存儲主密鑰種子。這些種子一直存在于TPM設備中。它們就是密鑰生成函數輸入的秘密信息。當TPM創建一個主密鑰時,它使用主密鑰種子和一個公共模板來生成密鑰。密鑰模板包含了所有的密鑰配置信息:密碼算法和密鑰長度,密鑰的policy,密鑰的類型(簽名,加密等等)。調用者還可以在模板中添加自己的獨有數據。該獨特數據在模板的公鑰區域中添加。
密鑰生成函數KDF
密鑰生成函數是固定的,相同的輸入可以生成相同的輸出。對于相同的種子,相同的密鑰模板總是會產生相同的密鑰。用戶通過改變密鑰模板中的獨特數據,可以創建無限多個主密鑰。
當TPM創建好一個主密鑰后,密鑰就存儲在TPM的易失性內存中。這時候用戶有兩種選擇。通過TPM2_EvictControl將有限數量的主密鑰轉到非易失性的內存空間。剩下的主密鑰繼續保存在易失性內存中。
如果所需的主密鑰數量多于TPM可以保存到持續性存儲空間和易失性存儲空間中的密鑰數量,可以選擇性地將密鑰從易失性內存中清除,或者先將非易失性存儲空間中的密鑰移動到易失性存儲空間,然后再清除。因為密鑰種子是永久性的,所以密鑰永遠不會丟失。
如果調用者知道完全公開的密鑰模板,TPM就可以在需要的時候重新創建一個完全一樣的密鑰。進一步講,如果重新創建的密鑰是RSA密鑰,那這個過程可能需要很長時間。如果重新創建的密鑰是橢圓曲線,AES,或者HMAC密鑰,創建的過程就會非常快。
在TPM1.2中,有一個背書密鑰和與這個密鑰相關的TPM廠商簽名過的證書。他們被存儲在非易失性內存中,在最終的用戶使用包含TPM設備的系統時,它們也就同樣擁有了這個背書密鑰的證書,證書和密鑰通常被存儲在TPM的NVRAM中。在TPM2.0中,用戶可以擁有多個密鑰/證書對。如果不想浪費持續性存儲空間,那應該怎么辦呢?
一個可能的同時也是TPM廠商期望的解決方法是:讓TPM生產商使用背書密鑰種子生成幾個背書主密鑰和相應的證書,密鑰使用標準算法集和廣為人知的模板。其中的一種密鑰及其證書,比如流行的RSA-2048被存儲到持續性內存中。廠商可以將剩下的密鑰清除,但是保存相應的證書。
TCG的基礎設施工作組已經定義了一些背書主密鑰的模板。RSA模板使用RSA-2048,SHA-256,和AES-128。ECC模板使用NIST-P256曲線,SHA-256,和AES-128。這兩種模板使用相同的授權策略,這個授權策略要求知道背書組織架構的口令。
模板的獨有數據部分是空的。密鑰屬性fixedTPM和fixedParent都為真,也就是背書密鑰被期望的那樣,不能被復制。userWithAuth和adminWithPolicy被設定固定值。密鑰的類型是restricted decryptkey:
假設用戶想要一個不同的主密鑰。他可以將TPM廠商預置在TPM中的密鑰清除,然后自己選擇算法重新生成一個主密鑰。因為密鑰的種子沒有變化,并且用戶重新生成密鑰的時候使用的模板與TPM廠商使用的相同,所以用戶得到的密鑰和TPM廠商之前生成的密鑰相同。用戶可以把密鑰的公鑰部分當作TPM廠商證書列表的索引。這個證書可以存儲在一個公共的服務器上。這樣用戶就可以方便的訪問證書并開始使用。這種可重復的密鑰生成方式允許TPM廠商在生產TPM時就預先生成許多密鑰及其證書,但是不用將所有的密鑰都存儲到非易失性內存中。可在最終的用戶需要的時候重新生成。
一旦種子被修改,主密鑰就永遠不能再重新生成了,TPM中所有基于這個種子的密鑰都被認為是無效的。種子被修改也意味著所有廠商生成的所有證書都將沒有意義。TPM廠商為一個新的TPM背書密鑰生成證書非常困難,所以修改背書組織架構的種子將受控于平臺組織架構,這里的平臺組織架構通常是指OEM廠商。這也就意味著最終的用戶很難修改這個種子。
從另一方面講,只要用戶在密鑰模板中的隨便輸入一些獨有數據,他就可以創建和TPM廠商完全沒有關系的,自己獨立的背書密鑰,可以在特定的場景下使用這個方法。
應用案例:多個主密鑰
用戶可以擁有多個主存儲密鑰作為密鑰組織架構的根節點。但是這些密鑰不能全部存儲在非易失性內存中。如果用戶使用大家熟知的模板創建密鑰,他可以在需要的時候重新創建這些密鑰。TPM命令如下:
- TPM2_NV_Read:從TPM的NV區域中讀取密鑰模板。TPM廠商可能會事先配置幾種模板(比如說,一個RSA和一個ECC),這些模板和廠商配置的證書相匹配。用戶也有可能有公司級別的模板。
- TPM2_CreatePrimary:需要選擇模板。
- TPM2_EvictControl:可以選擇性地將密鑰配置成持續存在于TPM中。尤其是對于RSA密鑰來說,這樣就能節省重新生成密鑰的時間(重新生成這種密鑰很費時間)。當然密鑰也可以留在易失性內存種,每次上電以后重新生成它們。
密鑰的持續性
用戶可以通過TPM2_EvictControl命令將一個密鑰有易失性內存轉移到非易失性內存中,密鑰可以在兩個上電周期之間保持加載狀態。通常情況下,我們只希望有一小部分主密鑰,可能是一個組織架構一個,被轉成持續性的,這樣就可以省去重新生成密鑰的時間,從而提升性能。背書,存儲,和平臺組織架構下除主密鑰以外的其他密鑰也可以被設置成持續性的。一個典型的應用案例是,在系統啟動初期時硬盤不可用,但是這時候需要一個密鑰。另外一個應用場景就是在資源受限的平臺上,比如說嵌入式控制器,它可能沒有外部的持續性非易失性的存儲空間。NULL組織架構下的密鑰都不能被設置成持續性的。它們在重啟后被清除。雖然只有有限數量的密鑰可以被設置成持續性的,但是TPM可以處理理論上無限多的密鑰。因為應用程序將TPM當作密鑰緩存來使用。
密鑰緩存
對于不是主密鑰的其他密鑰來說,TPM就像是一個密鑰緩存。具體來說,TPM2_Create命令創建一個密鑰后,使用這個密鑰的父密鑰加密,然后向調用者返回加密過的密鑰。用戶會將密鑰存儲在TPM之外,可能是硬盤中。當用戶需要使用這個密鑰時,他必須使用TPM2_load密令將密鑰加載到它的父密鑰下。使用完成以后,用戶可以使用TPM2_FlushContext命令將密鑰從TPM內存中清除。這個使用過程與主密鑰不同,主密鑰沒有父節點,他被創建以后會暫時保留在TPM中。一個典型的硬件TPM可能會有5-10個密鑰位置(槽,key slots):密鑰槽就是密鑰可以加載到的TPM內存空間。TPM管理系統負責將密鑰換入換出密鑰緩存。
密鑰的句柄與名稱
TPM授權參數中并不包含密鑰句柄,授權使用的是名稱。原因來自于密鑰緩存和密鑰換入換出操作。一個平臺可能有大量的應用軟件相關的密鑰存儲在磁盤上,它們可能通過用戶的句柄來識別。但是這樣會導致句柄的數量遠遠超過TPM密鑰槽的數量。當管理系統重新加載一個密鑰后,它可能會得到一個不同的handle,這個handle可能是和TPM密鑰槽的空閑狀態相關的,而不是用戶初始的handle。因此,中間件必須替換用戶handle。如果授權數據中包含了handle信息,那中間件替換handle將會導致授權失敗。
TPM2.0通過將名稱添加到授權數據中來解決這個問題,名稱就是密鑰公鑰部分的摘要值。TPM管理系統可以修改密鑰的handle,但是不能改變密鑰的名稱。
密鑰授權訪問控制
TPM對密鑰做了硬件保護,相對于軟件生成的密鑰,在安全性上有很大的提高,但是它仍然在此基礎上提供更加強大的密鑰訪問控制功能。一個軟件生成的密鑰經常通過使用口令做訪問控制來保護密鑰。比如說,一個密鑰可能會用口令來加密。這種保護的強度與口令本身的強度一樣,所以這個密鑰很容遭受線下的暴力攻擊。也就是說,一旦攻擊者拿到了加密過的密鑰,解密這個密鑰就變成了破解用于加密它的口令。密鑰的所有者不能阻止一個高頻率嘗試口令的攻擊方法。并且這種攻擊可以被并行化,可以利用不同的機器同時使用不同的口令來實施破解。云服務已經讓這種攻擊變得非常容易了。
密鑰訪問控制
TPM針對軟件生成的密鑰做了兩方面的改進。
- 當密鑰離開TPM時,它會被一個強度很高的父密鑰加密。此時攻擊者需要破解一個強度很高的密鑰而不是一個口令。
- 當密鑰被加載到TPM中時,它還會受到字典攻擊防護邏輯的保護。每一次攻擊者嘗試授權密鑰失敗時,這個行為就會被記錄下來。當失敗的次數達到一定預置值時,TPM就會阻止密鑰授權,并保持一段事先配置好的時間。這將很可能大大降低攻擊者實施攻擊的頻率。這種頻率限制機制可以保證即使破解一個很弱的口令也要耗費比破解軟件密鑰長得多的時間,因為軟件的密鑰沒有嘗試頻率限制。
密鑰銷毀
- 密鑰的銷毀非常困難,因為通過軟件生成的密鑰可能被復制過多份,存儲在不同的地方。但是TPM中的密鑰有父密鑰或者本身就是主密鑰,通過銷毀父密鑰或者主密鑰種子,就可以確保這些密鑰被徹底銷毀。
- TPM有三種持續性的組織架構(背書,存儲,平臺)和一個易失性的組織架構(空組織架構)。每一個架構都有它獨有的主密鑰種子。把主密鑰種子擦除后,就可以阻止在相應的阻止架構下重新創建主密鑰,當然這是一個影響重大并且很少做的操作。擦除主密鑰可以阻止所有它的子密鑰被加載到TPM中。這樣任何屬性配置為必須存在于TPM中的密鑰也都被認為是銷毀了。
密鑰組織架構
一個組織架構可以被想象成由一個父節點密鑰和子密鑰,或者說是祖先和后代組成的層次化結構。所有的父密鑰都是存儲密鑰,也就是說這些密鑰都是用于加密它們的子密鑰的。因此這些存儲密鑰用于保護它們的子密鑰,當子密鑰被存儲到TPM安全的硬件邊界之外時,父密鑰能夠提供保密性和完整性。這些存儲密鑰的用途因此受到限制,他們不能用于通用的數據解密操作,這樣會泄漏子密鑰的私密信息。
在組織架構最頂端的終極父密鑰就是主密鑰。子密鑰可以是存儲密鑰,這種情況下它可以有自己的子密鑰。子密鑰也可以是非存儲密鑰,這種情況下它們只能是葉子密鑰,而不能擁有自己的子密鑰結點。
密鑰類型及其屬性
每一個密鑰在創建時都會設置自己的屬性。密鑰屬性包括以下部分:
- 密鑰用途,比如簽名或者加密。
- 密鑰類型,對稱或者非對稱,以及相關的算法。
- 和密鑰復制相關的限制。
- 和密鑰用途相關的限制。
密鑰復制屬性
密鑰復制是指將一個密鑰從一個組織架構下拷貝到另外一個地方(組織架構)。這個密鑰可以成為另外一個父密鑰的子密鑰。目的組織架構或者父密鑰可以在相同或者不同的TPM中。主密鑰不能被復制,它們對于一個TPM的一個組織架構來說是固定的。
密鑰復制的初始作用是密鑰備份。如果一個密鑰被永久地鎖定到一個TPM中,但是這個TPM或者TPM所在的主板損壞了,這個密鑰也就永遠的丟失了。
第二種應用案例就是在多個設備之間共享密鑰。一個用戶的簽名密鑰可以在他的筆記本,平板和手機之前復制。
TPM1.2有一個和密鑰復制類似的過程叫做密鑰遷移。從字面意義上看,遷移的言外之意就是一個密鑰經過遷移之后只存在于目的為止,而原來的位置已經沒有這個密鑰了。但是實際上并不是這樣的。密鑰遷移完成之后,密鑰仍然存在于原來的位置。基于這個原因,TPM2.0將這個名字修改成了更加準確的復制。
TPM2.0的密鑰有兩個控制復制的屬性。在極端情況下,一個密鑰可以被鎖定到一個TPM的一個父密鑰下,永遠不能被復制。相反的極端情況是,一個密鑰可以隨意地被復制到相同或者不同TPM的另外一個父密鑰下。
控制密鑰復制屬性的定義如下:
- fixedTPM:如果密鑰的這個屬性被設置,這個密鑰就不能被復制了。
- fixedParent:如果密鑰的這個屬性被設置,這個密鑰就不能被復制到不同的父密鑰下。這相當于密鑰被鎖定到一個父密鑰下。
這兩個布爾屬性一共有如下四種組合:
- fixedTPM為真,fixedParent為假。TPM不允許這個配置組合存在。因為fixedTPM已經表明密鑰不能以任何形式被復制,這樣fixedParent為false又暗示密鑰可以復制到不同的父密鑰下,這就自相矛盾了。
- fixedTPM和fixedParent都為真,表示這個密鑰不能以顯式或隱式的方式被復制。
- fixedTPM為假,fixedParent為真,表示一個密鑰不能顯式地被復制。因為它被鎖定到一個父密鑰下。但是如果它的父密鑰被復制了,這個密鑰會被隱式地被復制。
- fixedTPM和fixedParent都為假,表示一個密鑰可以以復制組或者復制根的方式被復制。如果它是一個父密鑰,那它的子密鑰也將跟它一起被復制。
受限制的密鑰
受限制的簽名密鑰:受限制的簽名密鑰主要用于對TPM的認證數據結構簽名。這些結構包括平臺配置寄存器(PCR)引用,一個正在被認證的TPM對象,一個針對TPM時間的簽名,或者是針對一個審計摘要的簽名。簽名主要作用于摘要上,但是簽名驗證者想要確保這個摘要不是由外部的偽造數據計算而來,然后發送給TPM來簽名。比如說,一個“引用”就是一個針對一組PCR值得簽名,但是真正的簽名過程實際上是針對這組PCR值的摘要來做的。一個用戶可能對任意PCR做摘要,然后使用一個非限制性的密鑰來簽名這個摘要。之后這個用戶還可以聲稱這個簽名值就是一個“引用”。但是,一個可信賴第三方會發現這個密鑰不是限制性密鑰,所以不會相信這個聲明。因此,一個限制性的密鑰可以保證這是針對一個由TPM自己產生的摘要產生的簽名。
受限制的解密密鑰實際上是一個存儲密鑰。這種密鑰只用于解密特定格式的數據,包括用于驗證一個數據結構的完整性校驗值。只有這樣的密鑰才可以作為父密鑰去創建和加載子密鑰對象,或者是去激活一個證書。這些操作為解密的結果增加了一些限制。比如說,加載密鑰并不會返回解密的結果(而是一個密鑰的handle)[我自己的理解是,加載了密鑰,返回特定的handle,所以才會只能有特定的功能]。
一個不受限制的密鑰可以用于通用的解密操作,給它提供相關的加密數據它就會返回解密后的結果(作為一個加解密模塊來用)。如果這個密鑰被允許用作存儲密鑰,它就可以解密一個子密鑰的私鑰并返回給調用者。如果這個密鑰可以被用于隱藏數據,它不需要檢查unseal授權就可以返回被隱藏的(sealed)數據。
上下文管理和加載
加載密鑰需要向TPM提供一個加密過的密鑰和一個已經加載的父密鑰。TPM使用父密鑰解密子密鑰并將解密后的密鑰存儲在易失性的密鑰槽中。
上下文管理包含將一個已經加載的密鑰的上下文保存到TPM之外,然后將保存的上下文加載到TPM中。當一個密鑰被保存時,它會被一個由組織架構秘密信息派生的對稱密鑰加密,這個對稱密鑰叫做組織架構證據。當密鑰被加載時,TPM使用這個對稱密鑰來解密。
總結
以上是生活随笔為你收集整理的【可信计算】第十次课:TPM密码资源管理(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode刷SQL题
- 下一篇: 程序员与HR博弈之:有城府的表达你的兴趣