物理真机上LUKS结合TPM的测试 —— 使用自己生成的密钥(正确版)

news/2024/11/23 3:04:50/

本文与前一篇文章物理真机上LUKS结合TPM的测试 —— 使用自己生成的密钥(问题版)相对应。

1. 创建磁盘空间

命令如下:

dd if=/dev/zero of=enc.disk bs=1M count=50

实际命令及结果如下:

$ dd if=/dev/zero of=enc.disk bs=1M count=50
输入了 50+0 块记录
输出了 50+0 块记录
52428800 字节 (52 MB, 50 MiB) 已复制,0.0597509 s,877 MB/s$ ls
enc.disk

2. 创建密钥

命令如下:

dd if=/dev/urandom of=disk.key bs=1 count=32

实际命令及结果如下:

$ dd if=/dev/urandom of=disk.key bs=1 count=32
输入了 32+0 块记录
输出了 32+0 块记录
32 字节已复制,0.00304557 s,10.5 kB/s$ ls
disk.key  enc.disk

3. 将enc.disk虚拟成块设备

命令如下:

sudo losetup /dev/loop0 enc.disk

实际命令及结果如下:

$ sudo losetup /dev/loop0 enc.disk$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

4. 加密enc.disk

命令如下:

sudo cryptsetup --key-file=disk.key luksFormat /dev/loop0

实际命令及结果如下:

$ sudo cryptsetup --key-file=disk.key luksFormat /dev/loop0
WARNING!
========
这将覆盖 /dev/loop0 上的数据,该动作不可取消。
Are you sure? (Type 'yes' in capital letters): YES$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

5. 映射磁盘

命令如下:

sudo cryptsetup --key-file=disk.key open /dev/loop0 enc_volume

实际命令及结果如下:

$ sudo cryptsetup --key-file=disk.key open /dev/loop0 enc_volume$ ls /dev/mapper/
control  enc_volumels /dev/mapper -l
总计 0
crw-rw---- 1 root root 10, 236  2月20日 11:14 control
lrwxrwxrwx 1 root root       7  3月 1日 14:27 enc_volume -> ../dm-0

6. 格式化映射分区

命令如下:

sudo mkfs.ext4 -j /dev/mapper/enc_volume

实际命令及结果如下:

$ sudo mkfs.ext4 -j /dev/mapper/enc_volume
mke2fs 1.46.5 (30-Dec-2021)
创建含有 34816 个块(每块 1k)和 8720 个inode的文件系统文件系统UUID:e2c828cc-7570-40d5-ab37-8a0b61f7a1e7
超级块的备份存储于下列块: 8193, 24577正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(4096 个块)完成写入超级块和文件系统账户统计信息: 已完成

7. 创建挂载点并挂载

命令如下:

mkdir mountpointsudo mount /dev/mapper/enc_volume mountpoint

实际命令及结果如下:

$ mkdir mountpoint
$ ls
disk.key  enc.disk mountpoint
$ sudo mount /dev/mapper/enc_volume mountpoint$ df -h
文件系统                大小  已用  可用 已用% 挂载点/
dev/nvme0n1p4           20G   13G  5.8G   69% /
devtmpfs                4.0M     0  4.0M    0% /dev
tmpfs                   7.7G  182M  7.5G    3% /dev/shm
tmpfs                   3.1G  237M  2.9G    8% /run
tmpfs                   7.7G  105M  7.6G    2% /tmp
……
tmpfs                   1.6G   48K  1.6G    1% /run/user/1000
/dev/mapper/enc_volume   28M   14K   25M    1% /home/penghao/TApp/experiment3/mountpoint

8. 准备明文文件

命令如下:

sudo sh -c 'echo "This is my plain text" > mountpoint/plain.txt'

实际命令及结果如下:

$ sudo sh -c 'echo "This is my plain text" > mountpoint/plain.txt'$ cat mountpoint/plain.txt 
This is my plain text

9. 卸载

命令如下:

sudo umount mountpoint

实际命令及结果如下:

$ sudo umount mountpoint
$ 

10. 关闭加密分区

命令如下:

sudo cryptsetup remove enc_volume

实际命令及结果如下:

$ sudo cryptsetup remove enc_volume$ ls /dev/mapper/
control

11. 卸除回环设备

命令如下:

sudo losetup -d /dev/loop0

实际命令及结果如下:

$ sudo losetup -d /dev/loop0
$ 

12. 创建主对象

命令如下:

tpm2_createprimary -Q --hierarchy=o --key-context=prim.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_createprimary --hierarchy=o --key-context=prim.ctx
name-alg:value: sha256raw: 0xb
attributes:value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth|restricted|decryptraw: 0x30072
type:value: rsaraw: 0x1
exponent: 65537
bits: 2048
scheme:value: nullraw: 0x10
scheme-halg:value: (null)raw: 0x0
sym-alg:value: aesraw: 0x6
sym-mode:value: cfbraw: 0x43
sym-keybits: 128
rsa: b45cd070a8b71ba21a5dce69f93035671e4a32bc3758490629f21458171884171a94d1d6446aceb61b6a1d0df65a7f0c0a1cfa4fdbd221c12c69204b0cb8ab146014b9dc439c90b0ed7f538c2a9e0b8f1d16598d572f26f7ca1bcd76d2b1a4a56ee492f1bee45fc255096fb3972c3844a1191245bc2d3e8adcf694223f976a2af739ef6d6223eab4f71593b10233ead81d0d861912c600dfe97f37108fa53ec32f8307f1061689da224af65feccf510758aa8331402e341bfaea38f9203d74c21b54d9aa388351a13852613be8453f47caf6dae5c4a0af73175c40acb6df4e6e2b71b622eb6df4d084b411f4be8ba9c0240f614816e191ff4412839917d8afbb$ ls
disk.key  enc.disk  mountpoint  prim.ctx

13. 将用户名和设备ID组合到文件

脚本如下(key_gen.sh):

#!/bin/bashusr_info=$(whoami)
dev_info=$(sudo dmidecode | grep "Serial Number" | head -n 1)
dev_info=${dev_info#*: }
echo "usr_info: ${usr_info}"
echo "dev_info: ${dev_info}"echo "${usr_info}" > key_info.dat
echo "${dev_info}" >> key_info.dat

运行脚本生成目标文件key_info.dat。

$ ls
disk.key  enc.disk  key_info.dat  mountpoint  prim.ctx

具体信息涉及隐私,在此略。

14. 生成哈希值并保存到文件

命令如下:

sudo tpm2_hash -C o -g sha256 -o hash.key -t ticket.bin key_info.dat

实际命令及脚本如下:

$ sudo /usr/local/bin/tpm2_hash -C o -g sha256 -o hash.key -t ticket.bin key_info.dat$ ls
disk.key  enc.disk  hash.key  key_info.dat  mountpoint  prim.ctx  ticket.bin

15. 创建对象

命令如下:

sudo tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=hash.key --parent-context=prim.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=hash.key --parent-context=prim.ctx
name-alg:value: sha256raw: 0xb
attributes:value: fixedtpm|fixedparent|userwithauthraw: 0x52
type:value: keyedhashraw: 0x8
algorithm: value: nullraw: 0x10
keyedhash: 82a56b8556b4cf0fea489c06a29a4bff2edd34af228fecfd156aaf32bed4d5a4$ ls
disk.key  enc.disk  hash.key  key_info.dat  mountpoint  prim.ctx  seal.priv  seal.pub  ticket.bin

16. 加载对象到TPM

命令如下:

tpm2_load  -Q --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_load --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctx$ ls
disk.key  enc.disk  hash.key  key_info.dat  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub  ticket.bin

17. 将对象从易失性空间移存到非易失性空间中

命令如下:

tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002
persistent-handle: 0x81010002
action: persisted

18. 用新的密钥替换旧的密钥

注意:之前的错误问题就出在这一步。

旧的命令如下:

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk 

旧的实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk 
$

这一步虽然替换密钥的时候没有出现问题,但是到下边使用新密钥的时候就会出现问题了。

新的命令如下:

tpm2_unseal -Q --object-context=0x81010002 --output=tmp.key 
sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk tmp.key

新的命令和执行结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 --output=tmp.key$ ls
disk.key  enc.disk  hash2.key  hash.key  key_info.dat  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub  ticket.bin  tmp.key$ sudo cat tmp.key 
z�B�����@Y��Q�Zd
/�����Y`�,�
$ sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk tmp.key
$ 

而第一条命令中如果不加--output=tmp.key选项,则终端输出为:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002
z�B�����@Y��Q�Zd
/�����Y`�,�

即使带上-Q选项,终端输出仍然为:

$ sudo /usr/local/bin/tpm2_unseal -Q --object-context=0x81010002
z�B�����@Y��Q�Zd
/�����Y`�,�

或者将终端输出重定向到文件中,再比较与指定--output=选项输出到文件时的差异:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 > kkk.key$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 --output=tmp.key$ sudo diff tmp.key kkk.key 
$ 

可以看到,两者完全一样,并无任何差异。

19. 彻底清除旧密钥

命令如下:

shred disk.key
rm -f disk.key

实际命令及结果如下:

$ shred disk.key 
$ ls
disk.key  enc.disk  hash2.key  hash.key  key_info.dat  kkk.key  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub  ticket.bin  tmp.key$ rm -f disk.key 
$ ls
enc.disk  hash2.key  hash.key  key_info.dat  kkk.key  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub  ticket.bin  tmp.key

20. 再次将enc.disk虚拟成块设备

命令如下:

sudo losetup /dev/loop0 enc.disk

实际命令及结果如下:

$ sudo losetup /dev/loop0 enc.disk$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

21. 使用保存于TPM中的密钥映射磁盘

命令如下:

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume
$$ ls -l /dev/mapper/
总计 0
crw-rw---- 1 root root 10, 236  2月20日 11:14 control
lrwxrwxrwx 1 root root       7  3月 1日 15:56 enc_volume -> ../dm-0

可见,由于在步骤18中没有直接使用一条命令,而是拆成了两条命令,并且将密钥保存到了(中间临时)文件中,到这里就不会出现“此口令无可用的密钥。”的错误了。但其实使用一句即标准输入方式与拆分成两句即临时中间文件方式并没有本质区别,内容也是相同的。具体原因只有留待以后深入研究了,很蹊跷。目前初步断定大概率是cryptsetup存在bug,小概率是终端下有看不见的字符进入了标准输入。

更进一步,如果步骤18中没有进行命令拆分,即使将本步骤中一条命令同样拆成两条,前一个命令将新密钥存入文件,后一条命令使用新密钥的文件进行磁盘映射,也仍然会出问题。

22. 再次挂载

命令如下:

sudo mount /dev/mapper/enc_volume mountpoint

实际命令及结果如下:

$ sudo mount /dev/mapper/enc_volume mountpoint
$ 
$ df -h
文件系统                大小  已用  可用 已用% 挂载点
/dev/nvme0n1p4           20G   13G  5.7G   69% /
devtmpfs                4.0M     0  4.0M    0% /dev
tmpfs                   7.7G  170M  7.5G    3% /dev/shm
tmpfs                   3.1G  323M  2.8G   11% /run
tmpfs                   7.7G  115M  7.6G    2% /tmp
……
tmpfs                   1.6G   52K  1.6G    1% /run/user/1000
/dev/mapper/enc_volume   28M   15K   25M    1% /home/penghao/TApp/experiment3/mountpoint

23. 查看挂载点中的内容

命令如下:

ls mountpoint

实际命令及结果如下:

$ ls mountpoint/
lost+found  plain.txt$ cat mountpoint/plain.txt 
This is my plain text

24. 卸载

命令如下:

sudo umount mountpoint

实际命令及结果如下:

$ sudo umount mountpoint $ df -h
文件系统        大小  已用  可用 已用% 挂载点
/dev/nvme0n1p4   20G   13G  5.7G   69% /
devtmpfs        4.0M     0  4.0M    0% /dev
tmpfs           7.7G  166M  7.5G    3% /dev/shm
tmpfs           3.1G  323M  2.8G   11% /run
tmpfs           7.7G  116M  7.6G    2% /tmp
……
tmpfs           1.6G   52K  1.6G    1% /run/user/1000

25. 关闭加密分区

命令如下:

sudo cryptsetup remove enc_volume

实际命令及结果如下:

$ sudo cryptsetup remove enc_volume$ ls /dev/mapper/
control

26. 卸除回环设备

命令如下:

sudo losetup -d /dev/loop0

实际命令及结果如下:

$ sudo losetup -d /dev/loop0$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

27. 将对象从非易失性空间中移除

命令如下:

tpm2_evictcontrol --hierarchy=o --object-context=0x81010002

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol --hierarchy=o --object-context=0x81010002
persistent-handle: 0x81010002
action: evicted


http://www.ppmy.cn/news/364684.html

相关文章

中兴c600 10GPON 三方兼容 数据配置

username:zte password:zte /EPON宽带配置**/ ZXAN#con t Enter configuration commands, one per line. End with CTRL/Z. ZXAN(config)# //配置ONU模版--------------- ZXAN(config)#pon ZXAN(config-pon)#onu-type TDTC-201E epon speed 10g-asymmetric description…

C600 业务配置(包含tr069 / voip配置)

一种快速注册方式(找一个已配置好的设备,进入onu 模式下,直接替换当前的sn) ZXAN(config-if-gpon_olt-1/1/3)#show pon onu un ZXAN(config)#int gpon_onu-1/1/3:10 ZXAN(config-if-gpon_onu-1/1/3:10)#auth-id sn CMDCD52246E…

第七章实验

三个整数排序 一、实验目的 掌握指针的概念,会定义并使用指针变量。学会使用数组的指针和指向数组的指针变量。学会使用字符串的指针和指向字符串的指针变量。学会使用指向函数的指针变量。 二、实验内容 1、输入三个整数,用指针实现从大到小排序 &…

Intel C220/C600 RAID 在硬盘上的数据结构-纯干货

Intel C220/C600 RAID 在硬盘上的数据结构-纯干货 以4盘6TB 组建的RAID 5为例阵列扇区在磁盘上的分布结构一些计算方法 以4盘6TB 组建的RAID 5为例 因为自己的4盘阵列坏了,数据恢复需要,就简单研究了一下磁盘阵列写在磁盘上的数据结构。 基础信息如下&a…

全志F1C600 sqlite3嵌入式移植安装全过程

https://blog.csdn.net/nanfeibuyi/article/details/88034543 https://blog.csdn.net/H542723151/article/details/100568182 https://www.cnblogs.com/wangkangluo1/archive/2012/05/27/2520465.html https://www.ibm.com/developerworks/cn/linux/l-makefile/ 全志F1C600板子…

【010 设备驱动】ioctl和unlock_ioctl有什么区别?

一、ioctl 作用 大部分驱动除了需要具备读写设备的能力外,还需要具备对硬件控制的能力。例如,要求设备报告错误信息,改变波特率,这些操作常常通过ioctl方法来实现。 二、ioctl和unlock_ioctl有什么区别? kernel 2.6.…

pyqt 主窗口传递图像到对话窗口

import sys from PyQt5 import QtWidgets, QtGui, QtCore# 对话窗口 class Dialog(QtWidgets.QDialog):def __init__(self, parentNone):super(Dialog, self).__init__(parent)self.setWindowTitle("Dialog")self.label QtWidgets.QLabel(self)self.label.setFixedS…

【电量计芯片】鼎盛合分享手机电量显示电量芯片技术

不知道有没有人会跟我一样曾经有手机电量焦虑症,电量没有满格出门一定会焦虑,电量低于三分之一就已经在想要不要充电了,而一旦电量颜色变黄以下我就不敢再玩手机,立即去充电。这种问题我相信肯定不是只有我一个人有,更…