当前位置: 首页 > news >正文

TPM 2.0实例探索2 —— LUKS磁盘加密(3)

接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(2)

本文大部分内容参考:

Code Sample: Protecting secret data and keys using Intel® Platform...

二、LUKS磁盘加密实例

3. 将密码存储于TPM的LUKS

由于自动挂载需要在运行时提供一个口令(密码)或密钥以执行cryptsetup命令而无需用户交互,它必须在某种程度上是明确的。一个方法被需要以在运行时加密口令或密钥直到它被需要以解密卷。此种方法也保护磁盘与其安装到的系统相分离的情况。这个方法是TPM。

改进的解决方案包括以下两步:

  1. 密封口令或密钥文件到TPM中。
  2. 解密存于内存中的秘密并将其传递给cryptsetup。

关于涉及到的TPM相关的命令详情,请参阅:

https://github.com/tpm2-software/tpm2-tools/blob/master/man/

Create and persist a sealing object and use it to seal a random byte sequence as the disk key:

创建一个密封对象并将其持久化,然后使用它去密封一个随机字节序列作为磁盘密钥。各步骤如下:

(1)创建主对象

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

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_createprimary -C o -c 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: bc1e9cc4713b036b158d10fe255cf04552efc53350a7c33efe1583c6224f22a38ffcbcf75209f23f510b4b3a6bb5956a4f43ac607f0b14d9c995e73b13bb7dde4ada49cf97eaa414aa0c34082a32bc79e25145d87b3e4bf95752c194c016605fffa919a646446b1c72c0fbef3b87f9eee7a255a7246ffa006006c6306556f56719ede8635b8073b0fd232095338a946bcbd7a2dc3c28deaf3bda0f05803807b537167db319ec5dfeb6ec70a7d0decebabbadaaa706512bc0da942824150e3feed25cb7bf83d56c11b6b54060c4a93b2a847c539ede710caf25a74e8f05d7115474f80bf07f63c5bc4558688ee87ae1a310611538fabbf86886a6bdf54f53e9bd

(2)创建加密密钥

dd if=/dev/urandom bs=1 count=32 status=none

实际命令及结果如下:

$ dd if=/dev/urandom of=disk2.key bs=1 count=32
输入了 32+0 块记录
输出了 32+0 块记录
32 字节已复制,0.00315624 s,10.1 kB/s

如果加了“status=none”参数,则结果如下:

$ dd if=/dev/urandom of=disk3.key bs=1 count=32 status=none
$ 

(3)创建对象

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

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_create -g sha256 -u seal.pub -r seal.priv -i disk2.key -C prim.ctx
$ sudo /usr/local/bin/tpm2_create -g sha256 -u seal.pub -r seal.priv -i disk2.key -C prim.ctx
name-alg:value: sha256raw: 0xb
attributes:value: fixedtpm|fixedparent|userwithauthraw: 0x52
type:value: keyedhashraw: 0x8
algorithm: value: nullraw: 0x10
keyedhash: 9e6abe1d1ec7da09e6f47b4f1d97a2a274ffb2ef98d52ef844b04463239fefbc

注:步骤(2)、(3)可以合为一步:

dd if=/dev/urandom bs=1 count=32 status=none | tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctx

(4)将公钥加载到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 -C prim.ctx -u seal.pub -r seal.priv -n seal.name -c seal.ctx

(5)将密钥从易失性空间移存到非易失性空间中

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

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol -C o -c seal.ctx 0x81010002
persistent-handle: 0x81010002
action: persisted

Install the new key in place of the old one, and delete the old key created previously:

用新的密钥替换旧的密钥,并且删除之前创建的旧密钥。各步骤如下:

(1)替换旧的密钥

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

 实际命令及结果如下:

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

(2)删除旧密钥

$ shred disk.key

销毁数据的方式分为擦除消除销毁级别。我们日常用的rm命令相当于是擦除,执行了删除操作,数据实际上还是存在磁盘上的。shred是一条终端命令,重复覆盖指定的文件,以使即使非常昂贵的硬件探测也难以恢复数据。shred命令删除一个文件之后,文件中的数据会被多次随机覆写,相当于执行的是清除级别的销毁数据操作。shred命令执行后文件系统会在原来的位置覆盖指定的数据。传统的文件系统符合此条件,但许多现代的文件系统都不符合条件。以下是会令shred 无效或不担保一定有效的文件系统的。比如有冗余镜像的Raid系统;不时进行快照记录的文件系统,像Network Applicance 的NFS 服务器等。shred命令只能清除文件,不能清除目录。

(3)擦除旧密钥

$ rm disk.key

(4)将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 
├─nvme0n1p1 259:1    0   511M  0 part /boot
├─nvme0n1p2 259:2    0   4.9G  0 part 
├─nvme0n1p3 259:3    0  19.5G  0 part 
├─nvme0n1p4 259:4    0  19.5G  0 part /
└─nvme0n1p5 259:5    0 432.5G  0 part /var/usr/local/opt/home/data

(5)使用保存于TPM中的密钥加密enc.disk

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

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal -c 0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume
此口令无可用的密钥。

(6)查看加密磁盘映射分区

未完待续。

相关文章:

TPM 2.0实例探索2 —— LUKS磁盘加密(3)

接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(2) 本文大部分内容参考: Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 3. 将密码存储于TPM的LUKS 由于自动挂载需要在运行时提供一…...

嵌入式Debian主机可接HDMI显示

1、ARM是何物 ARM是一种体系架构。它使用 32 位处理器核心,采用 RISC(Reduced Instruction Set Computer,精简指令集计算机)架构,核心的运算效率高,占用空间小,功耗低,应用于便携式…...

驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动

目录一、IIO 子系统简介二、IIO子系统使用的一些相关的结构体、函数等1、iio_dev 结构体  ①modes:是选择iio驱动设备支持的工作模式,模式分别有如下:  ②dev:其是一个设备结构体。  ②channels:为 IIO 设备通道…...

专利撰写 为什么要申请专利 申请专利对个人有什么利益关系 专利申请实例 如何申请专利 专利申请办理流程

专利撰写 专利是对发明者或创造者所创造的发明或设计提供一定期限的独占权的法律保护。撰写专利需要考虑到多方面的因素,包括发明或设计的技术性、可行性、独创性、保密性等等。以下是一些关于专利撰写的常见问题和注意事项:专利类型:专利包括…...

yolov5/6/7系列模型训练日志结果数据对比分析可视化

早在之前使用yolov3和yolov4这类项目的时候可视化分析大都是自己去做的,到了yolov5的时候,变成了一个工具包了,作者全部集成进去了,这里我们以一个具体的结果为例,如下:整个训练过程产生的指标等数据都会自…...

ppppp2-23

#!/bin/sh USBFILE/etc/ppp/usbdevices LIST/etc/ppp/diallist function ec25_find_ttyname() { DEVNAME$1 FLAG0 USB_FIND_PATH/sys/bus/usb/devices for dir in $(ls $USB_FIND_PATH) do echo $(ls USBFINDPATH/USB_FIND_PATH/USBF​INDP​ATH/dir) | grep ttyUSB > /dev…...

【GeoDjango框架解析——读取矢量数据写入postgis数据库】

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 geodjango框架解析之读取矢量数据shp文件写入postgis数据库 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录…...

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出,据业内相关人士称,在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度,因此各行各业都响应政策,在新政策落实之前致力于平台的转型升级,做新时代创新型的高质量发展,其实细…...

ThinkPHP ^6图片操作进阶

图片裁剪、缩略、水印不再是TP框架系统内置的功能,需要安装。 目录 安装 图片处理 1.创建图片对象 2.获取图片属性 3.裁剪图像 4.生成缩略图 6.保存图像 7.水印 安装 使用composer在项目根目录打开命令行执行: composer require topthink/think…...

深入理解JS作用域链与执行上下文

变量提升&#xff1a; 变量提升&#xff08; hoisting &#xff09;。 我可恨的 var 关键字&#xff1a; 你读完下面内容就会明白标题的含义&#xff0c;先来一段超级简单的代码&#xff1a; <script type"text/javascript">var str Hello JavaScript hoi…...

UnityEditor编辑器扩展代码实现Project搜索的实现功能和切换Component等

反射实现切换Gameobjecect-Comp之前介绍过Kinematic Character Controller这个插件这个插件很容易和另外一个插件混淆&#xff0c;两个作者头像比较相像&#xff0c;而且这个插件的作者不太喜欢露脸&#xff08;他现在做Dot-CharacterControl去了&#xff09;&#xff0c;几乎网…...

SKAdNetwork:从0到1

一、什么是SKAdNetwork https://developer.apple.com/documentation/storekit/skadnetwork iOS14.5开始&#xff0c;获取IDFA需要用户确认授权才可&#xff0c;此时SKAdNetwork 正式回归。 SKAdNetwork 是苹果在2018年推出的一个更加保护用户隐私的归因框架&#xff0c;并与…...

Spring+MVC+MYbatis注解开发

Spring常见注解 注解一&#xff1a;Configuration 用在类上面&#xff0c;加上这个注解的类可以成为一个spring的xml配置文件&#xff0c;使用的是java代码的配置 注解二&#xff1a;ComponentScan 用在类上&#xff0c;加上注解可以指定扫描路径 注解三&#xff1a;创建对…...

Redis主从复制过程

将目前服务器加入到端口号为6379的从服务器 一主二仆 当期中一台从服务器宕机之后 从服务器重启之后会变成单独的主服务器&#xff0c;与之前的主从复制没有关系&#xff0c;重新使用slaceof命令才能恢复到之前一样 主服务器宕机后&#xff0c;从服务器不会成为主服务器&…...

Spring boot开启定时任务的三种方式(内含源代码+sql文件)

Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09; 源代码sql文件下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09;源代码…...

Tekton实战案例--S2I

案例环境说明 示例项目&#xff1a; 代码仓库&#xff1a;https://gitee.com/mageedu/spring-boot-helloWorld.git 构建工具maven pipeline各Task git-clone&#xff1a;克隆项目的源代码 build-to-package: 代码测试&#xff0c;构建和打包 generate-build-id&#xff1a;生…...

四、使用类实现功能

使用类实现功能 ts中类的继承 ES6中class类中&#xff0c;属性分为&#xff1a;实例上的属性&#xff0c;原型上的方法&#xff1b;也可以叫做&#xff1a;class的属性&#xff0c;class的方法。 类的继承叫法&#xff1a;父类>子类&#xff0c;基类>派生类&#xff1b…...

Java多线程不安全的例子

目录 1. 可见性不安全例子 2. 原子性不安全例子 3. 有序性不安全例子 1. 可见性不安全例子 可见性&#xff1a;一个线程对共享变量的修改&#xff0c;另外一个线程不能够立刻看到。 如果多线程对共享数据进行访问而不采取同步操作的话&#xff0c;那么操作的结果是不一致…...

vivo X Flip会是高端手机市场的又一折叠屏爆款吗?

据多个平台消息&#xff0c;vivo即将推出小折叠屏手机X Flip。据了解&#xff0c;vivo X Flip将采用轻盈便携的竖向折叠布局&#xff0c;以及非常受女性消费者喜爱的结构设计。那么&#xff0c;vivo X Flip会是vivo折叠屏的又一个爆款吗&#xff1f; 一、vivo X Flip小折叠屏手…...

MySQL中MVCC如何解决不可重复读以及幻读?

了解MVCC之前&#xff0c;我们首先需要了解以下两个概念&#xff1a;一致性非锁定读和锁定读&#xff0c;了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现&#xff0c;通常做法是加一个版本号或者时间戳字…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...