加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析

  • 前言
  • 元数据分析
  • 元数据格式
    • 整体格式
    • 头部格式
      • 加密算法
      • 密码校验
      • key slot格式
      • 其它字段
  • 流程验证

前言

  • 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案,TKS1对密钥设置(Linux Unified Key Setup)的流程和方案做了统一的定义,Linux将LUKS应用于磁盘加密技术,定义了遵循LUKS1 On-Disk Format Specification的加密磁盘头部。虚拟化组件QEMU的加密磁盘在实现上同样遵循上述规范。下面我们具体介绍其具体内容。

元数据分析

  • LUKS1加密磁盘格式是基于TKS1的POC,因此LUKS1 On-Disk Format Specification的目的就是将TKS1的理论规范化并定义加密磁盘头部用于实现该规范。
  • 在分析LUKS1标准的加密磁盘头部之前,我们先回顾TKS1中要解决的几个问题并对应列出其对应方案以及方案涉及到的具体输入、输出和参数信息,进而推断出LUKS1加密磁盘头部至少应该具备哪些元数据信息:
  1. 防止用户弱熵密码被暴力破解和字典攻击
    TKS1通过PBKDF2函数来处理用户弱熵密码,派生出强熵密钥cipher作为master key的加密密钥。
    在这里插入图片描述
    PBKDF2涉及的输入有,password,salt,iterration-count,derived-key-length,输出cipher。
    该方案涉及的关键元素password为用户输入或者第三方密钥管理服务提供,无需保存到磁盘,saltiteration-countderived-key-length为用户配置,需要作为元数据保存到磁盘。
  2. 当用户密码作为磁盘加密密钥,用户密码的泄露会导致加密磁盘数据的泄露
    TKS1引入master key作为磁盘加密的密钥,设计两级加密方案将用户密码和加密磁盘的密钥解耦,可以避免当用户密码泄露但master key未泄露时,对已加密磁盘的重新加密。
    该方案中涉及关键元素有master key,master key生命周期为,磁盘首次加密时由加密软件随机生成master key的明文,首次加密完成后明文被cipher加密变为密文,作为元数据保存到磁盘,磁盘解密时将master key密文从磁盘中取出再通过cipher解密得到磁盘的明文。总结,master key的在初始化时被随机生成,写磁盘完成后作为元数据被保存到磁盘,读磁盘操作前从磁盘元数据中读出。master key的密文需要作为元数据保存到磁盘。
  3. 最大程度防止密钥的非可靠删除导致的信息泄露
    TKS1引入AF-Splitter算法将master key切分存储,LUKS在实现时AF-Splitter算法时将扩散因子H也设置为PBKDF2,因此masterr key在切分与合并时也会用到PBKDF2涉及的参数。LUKS实现AF-Splitter函数的伪代码如下:在这里插入图片描述
    可以看到其本身涉及到两个参数,一是切分的数据长度length,而是切分的组数(或者称为条带数)stripes,切分数据的长度就是master key的长度,而条带数允许用户配置。
  • 总结上面分析,我们可以知道LUKS1作为TKS1的POC,至少要在磁盘头部存放以下元数据:PBKDF2的迭代次数master key长度master keyAF-Splitter条带数
    除此之外,LUKS1作为标准规范,还会将标准参数化、兼容性及其它方面考虑在内,因此还会引入其它字段作为头部元数据。

元数据格式

整体格式

在这里插入图片描述

  • LUKS加密磁盘整体格式如上图所示,分为三个主要部分,分别是:
  1. LUKS phdr: 磁盘头部,保存实现规范涉及的元数据
  2. Key Material: 存放key master反取证拆分再加密后得到的数据,LUKS可以支持多个用户密码,每个密码可以唯一解密一个key master,从上图我们看到有8个key slot,对应地可以存放8个KM,因此LUKS支持用户最多设置8个密码。
  3. bulk data: 磁盘密文数据

头部格式

  • LUKS加密磁盘头部格式如下图所示:
    在这里插入图片描述

加密算法

  • LUKS支持用户指定加密磁盘的算法和模式,磁盘数据加密的伪代码如下:
    在这里插入图片描述
  • 其中加密算法由cipher-name指定指定,算法模式有cipher-mode指定,而key则是我们的master key。因此头部中也设计了cipher-name和cipher-mode两个字段用于存放用户设置的加密方式。
    其中可用的加密算法cipher-name有:
    在这里插入图片描述
    可用的加密模式cipher-mode有:
    在这里插入图片描述

密码校验

  • 从LUKS加密磁盘头部格式中我们似乎看到前文分析的几个需要落盘的元数据信息,key-bites,mk-digest-salt,mk-digest-iter,但这里其实只有第1个如我们分析,key-bites代表master key的长度,而mk-digest-salt,mk-digest-iter并非用作用户密码派生时的PBKDF2输入参数,而是校验master key的时候用。这里一并介绍LUKS怎么校验用户输入密码的正确性,其步骤如下:
  1. 加密磁盘初始化时随机生成key-bites长度的master key
  2. 之后对master key也做一次PBKDF2的派生计算,得到master key的摘要信息mk-digest,派生计算的伪代码如下:
    在这里插入图片描述
  3. 将以上信息mk-digest-salt, mk-digest-iteration-count, mk-digest作为元数据存放到LUKS加密磁盘头部
  4. 校验用户输入密码password时,可能是错误的,将password按照正常流程做PBKDF2做派生得到derived-key,然后逐一解密每个key slot得到master key的明文,将master key明文再按照b步骤做1次PBKDF2派生得到摘要信息并对比磁盘上读取的摘要信息,如果两者相同,说明用户输入的密码正确,如果不同说明用户密码不能解密当前key slot,之后遍历所有key slot,如果都没有匹配成功,说明用户密码不正确。
  • 从上面的描述来看,我们大概明白mk-digest-salt, mk-digest-iteration-count, mk-digest这几个字段的设计目的:支持校验用户输入的密码。因为LUKS不能存储master key的明文在元数据头部,所以设计了摘要字段用于校验master key的明文,而LUKS生成摘要的方式也是PBKDF2,因此这个字段才引起我们的误解。那么用于派生用户密码的PBKDF2参数存放在哪里的呢?其实它存放在每个key slot中了,下面继续介绍key slot格式。

key slot格式

  • 在LUKS头部的末尾,我们看到了8个key slot字段,这个字段才是我们前文提到的存放派生用户密码的PBKDF2参数的字段。对于每个key slot,用户都可单独指定PBKDF2的参数,因此PBKDF2在处理解密每个KM时其计算量也可能会不一样,有些密码可能迭代次数少,有些密码可能次数多,通过这样的布局,LUKS可以让每个用户密码互相独立不受影响。
  • key slot的具体布局如下图所示:
    在这里插入图片描述
  • 可以看到除了迭代次数和盐值以外,还有1个参数和key master相关,即条带数,这是AF-Splitter算法的参数。其它的,active标识对应的KM是否使能,key-masterial-offset存放key slot关联的KM在磁盘的偏移地址。

其它字段

  • 我们再回头逐一查看LUKS头部的其它元数据字段
  1. magic,6字节,标识磁盘为LUKS的魔数,其值为{‘L’,’U’,’K’,’S”,0xBA,0XBE}
  2. version,2字节,LUKS版本号
  3. hash-spec,PBKDF2算法除了上面介绍的参数以外,还有1个元素可以参数化,就是用于迭代计算的hash算法,LUKS也将其标准化,其可选的值为:
    在这里插入图片描述
  4. payload-offset: 加密数据的起始偏移
  5. uuid: 磁盘uuid

流程验证

  • TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模拟散列表(哈希表拉链法)

维护一个集合,支持如下几种操作: I x,插入一个整数 x;Q x,询问整数 x 是否在集合中出现过; 现在要进行 N 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N,…

举报“将我的电脑控作己用者”!

既然“麻辣800727”都说是“街子电信”干的,那么,我现在就正式举报:请依法管理宽带网,你国营的也不可以随意侵犯用户的人权,更不可以将自己变成法外之地! 请公开答复,并改正,否则把…

机器学习线性代数知识补充

线性代数知识补充 正交矩阵与正交变换方阵特征值与特征向量相似矩阵对角化二次型正定二次型 正交矩阵与正交变换 方阵特征值与特征向量 相似矩阵 对角化 二次型 正定二次型

H5游戏源码分享-超级染色体小游戏

H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…

应届裁员,天胡开局——谈谈我的前端一年经历

应届裁员&#xff0c;天胡开局——谈谈我的前端一年经历 许久没有更新了&#xff0c;最近一个月都在忙&#xff0c;没错&#xff0c;正如题目所说&#xff0c;裁员然后找工作… 这周刚重新上班&#xff0c;工作第二天&#xff0c;感慨良多&#xff0c;记录些什么吧。 去年十…

学习samba

文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB&#xff08;Server Message Block&#xff09;协议实现文件共享&#xff0c;也称为CIFS&#xff08;Common Internet File System&#xff09;。 2、是Windows和类Unix系统之间共享文件的…

【Linux】gitee仓库的注册使用以及在Linux上远程把代码上传到gitee上的方法

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家介绍一个在实际工作以及项目开发过程中非常实用的网站gitee&#xff0c;并教如何正确的使用这个网站以及常见问题的解决方案&#xf…

java基础-数据类型

1、变量 变量就是申请内存来存储值。也就是说&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。 因此&#xff0c;通过定义不同类型的变量&#xff0c;可以在内…

MySQL主主复制

主1 192.168.66.15 主2 192.168.66.16 主1&#xff1a; roottest2 ~]# hostname master1 [roottest2 ~]# bash [rootmaster1 ~]# vim /etc/my.cnf server-id11 log-binmysql-bin auto_increment_increment2 auto_increment_offset1 replicate-do-dbdemo_db …

appium+python自动化测试

获取APP的包名 1、aapt即Android Asset Packaging Tool&#xff0c;在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity 2、在android-sdk里面双击SDK-manager,下载buidl-tools 3、勾选build-tools&#xff0c;随便选一个版本&#xff0c;我这里选的是24的版…

ESP32/ESP8266基于Arduino框架下驱动1.8“tft_oled屏幕仿数码管时钟

ESP32/ESP8266基于Arduino框架下驱动1.8"tft_oled屏幕仿数码管时钟 &#x1f4cd;相关篇《ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示》&#x1f4fa;效果演示&#xff1a; &#x1f33f;屏幕显示部分&#xff0c;采用使用TFT_eSPI库驱动&#xff0c;利用该库自带的…

【SQLite】的使用及指令| 编程操作(增删改查)

一、SQLite 使用和指令集 SQLite 的基本使用SQL 命令 二、常见的 SQL 数据类型 三、SQLite的命令用法 四、SQLite的编程操作 五、sqlite3_open函数 六、sqlite3_close函数 七、sqlite3_errcode函数 八、SQLite C Interface 九、sqlite3_exec函数 十、callback回调函数 十一、…

vue:如何把后端传过来的数组的其中一个对象加入新的属性

加入我们是更改数组中的第一个对象&#xff0c;在vue中可以使用$set方法将属性插入到第一个对象中作为属性。 Script部分&#xff1a; <script>export default {data() {return {boxes: [//模拟后端传过来的数组{id:1,name:张三},{id:2,name:李四},{id:3,name:王五},{i…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

【SpringBoot篇】使用Spring Cache高效处理缓存数据

文章目录 &#x1f339;简述Spring Cache&#x1f3f3;️‍&#x1f308;常用注解&#x1f33a;使用SpringCache&#x1f6f8;Cacheable注解⭐测试 &#x1f6f8;CacheEvict&#x1f38d;一次清理一条数据&#x1f38d;一次删除多条数据 Spring Cache是一个框架,只要简单加一个…

【Mysql】MySQL基于成本的优化

什么是成本 我们之前说 过MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。那么成本是怎么计算的呢&#xff0c;其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组成的: I/O 成本 …

数据结构:反射

基本概念 反射中的四个类 Class类 Java文件在被编译之后&#xff0c;生成了.class文件&#xff0c;JVM此时解读.class文件&#xff0c;将其解析为java.lang.Class 对象&#xff0c;在程序运行时每个java文件就最终变成了Class类对象的一个实例。通过反射机制应用这个 实例就…

如何在Qemu上跑Milk-duo开发板

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;学习本文之前&#xff0c;要求先看一下Milk-V Duo快速上手的环境搭建部分&#xff0c;创建好镜像文件。 正文 编译milk-duo qemu &#xff08;1&#xff09;下面步…

No203.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

YOLOv8全网独家优化:IoU系列篇 | Inner-IoU融合MPDIoU,创新十足,2023年11月最新IoU改进

🚀🚀🚀本文改进: Inner-IoU(基于辅助边框的IoU损失)结合MPDIoU进行创新,创新十足,全网首发 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Inner-IoU介绍 论文:https://arxiv.org/abs/2311.02…