如何在笔记本电脑上使用TPM2.0芯片存储个人数据
先讲核心前提
TPM2.0不是通用U盘类存储设备,绝大多数消费级笔记本内置TPM的非易失性(NV)存储空间只有1~10KB,少数高端机型最多也就几MB,仅适合存密钥、短密码、哈希值这类极小体量的数据,根本存不了文档、图片这类大文件。如果要存大体积个人数据,正确逻辑是把加密密钥存在TPM里,文件本身放硬盘,靠TPM做硬件级的密钥保护,硬盘被拆走也拿不到数据。下面是Windows和Linux下可直接复现的操作步骤。
Windows 系统操作
操作全程需要开管理员权限的PowerShell,先执行Get-Tpm,返回结果里TpmReady为True才可以继续操作。
- 小数据直接写入TPM NV存储(适合存<1KB的短文本、密钥串)
TPM的NV空间靠索引寻址,选用户自定义区间的索引即可,别碰0x01C00000以下的系统保留索引(存BitLocker、启动校验数据的,改坏了直接进不去系统),这里以索引0x01000001、分配100字节空间为例:- 创建NV空间,设置所有者权限读写:
$nvIndex = 0x01000001 $nvSize = 100 Initialize-TpmNV -Index $nvIndex -Size $nvSize -AuthWrite Owner -AuthRead Owner- 写入数据,比如存字符串"我的私密测试内容":
$data = [System.Text.Encoding]::UTF8.GetBytes("我的私密测试内容") Set-TpmNV -Index $nvIndex -Value $data- 读取数据:
不需要这个空间的时候,执行$readData = Get-TpmNV -Index $nvIndex [System.Text.Encoding]::UTF8.GetString($readData)Uninitialize-TpmNV -Index $nvIndex删除即可。 - 大体积个人数据加密存储(日常用推荐这个方案)
系统自带的BitLocker是用TPM存密钥保护整盘/分区,如果只需要加密单个文件,用DPAPI-NG命令即可,密钥存在TPM,文件放本地硬盘,没有本机TPM就算拷走硬盘也解不开:
加密D盘下的secret.txt文件,输出加密后的文件secret_enc.txt:
解密直接执行:$cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {$_.HasPrivateKey -and $_.PrivateKey.Provider -eq "Microsoft Platform Crypto Provider"} | Select-Object -First 1 Protect-CmsMessage -Path D:\secret.txt -OutFile D:\secret_enc.txt -To $cert
解密过程TPM会在硬件内部校验设备状态,不需要额外输密码,也可以额外配置PIN做双因素验证。Unprotect-CmsMessage -Path D:\secret_enc.txt -OutFile D:\secret_decrypt.txt
Linux 系统操作
先从发行版源安装tpm2-tools包,Debian/Ubuntu执行apt install tpm2-tools,Fedora执行dnf install tpm2-tools,所有操作需要root权限,先执行tpm2_getcap properties-variable能正常返回TPM属性再继续。
- 小数据直接写入TPM NV存储
同样选用户可用索引0x01000001,分配100字节空间,设置读写权限:
把本地plain.txt里的短内容写入TPM:tpm2_nvdefine 0x01000001 -s 100 -a "ownerread|ownerwrite|authread|authwrite"
读取TPM里的内容存到read.txt:tpm2_nvwrite 0x01000001 -i plain.txt
不需要该空间时执行tpm2_nvread 0x01000001 -o read.txttpm2_nvundefine 0x01000001删除。 - 大体积个人数据加密存储(日常推荐)
可以配合LUKS做整盘加密,也可以把文件加密密钥密封到TPM,绑定系统PCR校验值(系统固件、引导项被篡改就无法解封密钥):- 生成32字节随机加密密钥,绑定PCR0、PCR2、PCR4、PCR7(对应固件、启动配置、引导程序状态)密封到TPM:
dd if=/dev/urandom of=~/encrypt.key bs=32 count=1 tpm2_createpolicy --policy-pcr -l sha256:0,2,4,7 -L pcr.policy tpm2_create -C owner -u seal.pub -r seal.priv -a "fixedtpm|fixedparent|sensitivedataorigin|userwithauth|decrypt" -L pcr.policy -i ~/encrypt.key tpm2_load -C owner -u seal.pub -r seal.priv -c seal.ctx- 之后用encrypt.key做AES加密本地文件即可,解密前先从TPM解封密钥,没有本机TPM就拿不到密钥,无法解密文件。
注意事项:
- 绝对不要随意修改、删除系统保留的TPM NV索引,轻则导致BitLocker锁死,重则系统无法启动
- 不管是直接存在TPM NV里的数据,还是TPM密封的加密密钥,一定要单独备份一份,TPM被清空、主板损坏时数据会彻底丢失,无法恢复
- 绑定PCR值时不要选太多容易变动的PCR槽,否则升级BIOS、改引导项之后会无法解封自己的密钥
内容的提问来源于stack exchange,提问作者Lmao Kins
相关产品推荐
相关产品推荐

