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