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.0598319 s,876 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.00337319 s,9.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_volume$ ls -l /dev/mapper/
总计 0
crw-rw---- 1 root root 10, 236  2月20日 11:14 control
lrwxrwxrwx 1 root root       7  2月24日 13:47 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
$

注意:这一部中必须要确保disk.key没有被改变。

19. 彻底清除旧密钥

命令如下:

shred disk.key
rm -f disk.key

实际命令及结果如下:

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

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
此口令无可用的密钥。

自定义密钥的方式还是存在一些问题。用随机数密钥是可以的,一旦用自定义密钥就始终提示次口令无可用的密钥。具体原因还需要进一步分析和查找。

……

几经周折,最后终于找到了问题的源头,实际上是一个有些“搞笑”的原因。当然其背后更深层次的原因还需要进一步弄清楚,不过目前能找到出问题的地方并且能绕过去也就够了。

出问题的地方是这里:

步骤18中通过'|'实现了一行命令完成两个操作。把这两个操作拆成独立的操作,并且将第一个操作“ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002”保存到(临时中间)文件中,即加入-o选项或--output=FILE选项“ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 --output=tmp.key”,然后在第二个操作中将选项将原命令改为“sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk tmp.key”,即不从标准输入中获取新密钥,而从(临时中间)文件中获取新密钥。

经过以上修改后,执行到步骤21时就不会出现错误了。

物理真机上LUKS结合TPM的测试 —— 使用自己生成的密钥(问题版)相关推荐

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

    本文与前一篇文章物理真机上LUKS结合TPM的测试 -- 使用自己生成的密钥(问题版)相对应. 1. 创建磁盘空间 命令如下: dd if=/dev/zero of=enc.disk bs=1M co ...

  2. 物理真机上LUKS结合TPM的测试 —— 使用随机数密钥

    1. 创建磁盘空间 命令如下: dd if=/dev/zero of=enc.disk bs=1M count=50 实际命令及结果如下: $ dd if=/dev/zero of=enc.disk ...

  3. 真机上装不上测试应用,Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

    真机上老是装不上某个测试应用,而其他应用没问题! 总是出现以下错误提示: [2016-05-05 23:23:43 - Manage] Installation error: INSTALL_FAIL ...

  4. flappy bird游戏源代码揭秘和下载后续---移植到android真机上

    前言:         上一篇博客 flappy bird游戏源代码揭秘和下载,源码是运行在window或者mac系统上的,现在我们需要把代码移植到android真机上,让小鸟在手机里飞起来! ps: ...

  5. Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端...

    前言 问题一:我们在App内嵌H5开发的过程中,肯定会遇到一个问题就是我不想在chrome的控制台中调试也不想在模拟器中调试,我想要在真机上调试,那么如何解决这个问题呢? 问题二:我们期待调试时达到的 ...

  6. Xcode7将无需开发者授权也能在真机上调试App

    在Xcode 7中,苹果改变了自己在许可权限上的策略,此前Xcode只开放给注册开发者下载,但Xcode 7改变了这种惯有的做法,无需注册开发者账号,仅使用Apple ID就能下载和上手体验.此前开发 ...

  7. Appium在小米11真机上进行微信自动化

    jdk.python.nodejs要准备好 苦恼于配环境的同学可以尝试Aritest框架,我写了一篇博客供参考Airtest手机APP自动化操作微信 下载appium 仓库地址 注意他不让自定义安装目 ...

  8. 解决使用安卓模拟器容易被识别的问题,实现真机上的真正模拟器

    有很多朋友无论做网赚手赚或者其他什么手机相关项目的时候,第一想法都是使用安卓模拟器在pc上操作,但很遗憾,很多项目在pc模拟器上使用都是容易被识别,因为模拟器本来就有一些固定参数是模拟器特有的. 我们 ...

  9. 如何将应用程序在Iphone真机上调试

    实习的时候老板交给了我一个任务,就是如何配置iPhone应用程序在真机上测试.下面将那个70页的英文资料浓缩到一页之中. 首先来到iphone开发者社区:http://developer.apple. ...

最新文章

  1. UVA 11020 - Efficient Solutions(set)
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY15-规则学习
  3. MySQL 慢查询日志工具之pt-query-digest
  4. 阿里GTS解密--GTS的原理、架构与特点
  5. PyQt5初级——2
  6. XGBoost在携程搜索排序中的应用
  7. 创建 Image - 每天5分钟玩转 OpenStack(21)
  8. 使用临时表解决union和order by不能同时使用的问题
  9. innodb下的mvcc_从InnoDB了解MVCC
  10. c#endread怎么打印出来_C#教程之打印和打印预览
  11. 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
  12. 计算机科学技术考研内容,计算机科学技术考研考什么科目
  13. [待总结]注册软件常用注册方法
  14. win 启动redis_Redis慢查询日志
  15. Tensorboard 安装及使用
  16. 记账系统(java)
  17. 基于LSTM网络的藏头诗和古诗自动生成(附完整代码和数据)
  18. vs报错:8007000E 内存资源不足,无法完成此操作
  19. tr命令解析_学习笔记
  20. 计算机网络并行传输和串行传输,网线RJ45是并行传输还是串行

热门文章

  1. 学习技巧:日语顺口溜单词记忆法
  2. Java异常处理实验
  3. [论文笔记|声呐]——侧扫声呐图像的三维重建
  4. php海淀区 达内_联系我们
  5. 计算机课翻转课堂教案,大学计算机翻转课堂实施方案-翻转课堂教学案例评比.pdf...
  6. 如何运营小红书网络推广呢?
  7. python爬虫:爬取猎聘网站职位详情
  8. swagger-codegen自动生成代码工具的介绍与使用
  9. matlab datenum函数用法
  10. 浅谈餐饮业如何实施ERP(转)