易站网站建设,jsp可以做网站首页吗,做网站这么做,wordpress 发布文章功能修改虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言
我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方… 虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验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加密磁盘头部至少应该具备哪些元数据信息
防止用户弱熵密码被暴力破解和字典攻击 TKS1通过PBKDF2函数来处理用户弱熵密码派生出强熵密钥cipher作为master key的加密密钥。 PBKDF2涉及的输入有passwordsaltiterration-countderived-key-length输出cipher。 该方案涉及的关键元素password为用户输入或者第三方密钥管理服务提供无需保存到磁盘saltiteration-countderived-key-length为用户配置需要作为元数据保存到磁盘。当用户密码作为磁盘加密密钥用户密码的泄露会导致加密磁盘数据的泄露 TKS1引入master key作为磁盘加密的密钥设计两级加密方案将用户密码和加密磁盘的密钥解耦可以避免当用户密码泄露但master key未泄露时对已加密磁盘的重新加密。 该方案中涉及关键元素有master keymaster key生命周期为磁盘首次加密时由加密软件随机生成master key的明文首次加密完成后明文被cipher加密变为密文作为元数据保存到磁盘磁盘解密时将master key密文从磁盘中取出再通过cipher解密得到磁盘的明文。总结master key的在初始化时被随机生成写磁盘完成后作为元数据被保存到磁盘读磁盘操作前从磁盘元数据中读出。master key的密文需要作为元数据保存到磁盘。最大程度防止密钥的非可靠删除导致的信息泄露 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加密磁盘整体格式如上图所示分为三个主要部分分别是
LUKS phdr: 磁盘头部保存实现规范涉及的元数据Key Material: 存放key master反取证拆分再加密后得到的数据LUKS可以支持多个用户密码每个密码可以唯一解密一个key master从上图我们看到有8个key slot对应地可以存放8个KM因此LUKS支持用户最多设置8个密码。bulk data: 磁盘密文数据
头部格式
LUKS加密磁盘头部格式如下图所示
加密算法
LUKS支持用户指定加密磁盘的算法和模式磁盘数据加密的伪代码如下 其中加密算法由cipher-name指定指定算法模式有cipher-mode指定而key则是我们的master key。因此头部中也设计了cipher-name和cipher-mode两个字段用于存放用户设置的加密方式。 其中可用的加密算法cipher-name有 可用的加密模式cipher-mode有
密码校验
从LUKS加密磁盘头部格式中我们似乎看到前文分析的几个需要落盘的元数据信息key-bitesmk-digest-saltmk-digest-iter但这里其实只有第1个如我们分析key-bites代表master key的长度而mk-digest-saltmk-digest-iter并非用作用户密码派生时的PBKDF2输入参数而是校验master key的时候用。这里一并介绍LUKS怎么校验用户输入密码的正确性其步骤如下
加密磁盘初始化时随机生成key-bites长度的master key之后对master key也做一次PBKDF2的派生计算得到master key的摘要信息mk-digest派生计算的伪代码如下 将以上信息mk-digest-salt, mk-digest-iteration-count, mk-digest作为元数据存放到LUKS加密磁盘头部校验用户输入密码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头部的其它元数据字段
magic6字节标识磁盘为LUKS的魔数其值为{‘L’,’U’,’K’,’S”,0xBA,0XBE}version2字节LUKS版本号hash-specPBKDF2算法除了上面介绍的参数以外还有1个元素可以参数化就是用于迭代计算的hash算法LUKS也将其标准化其可选的值为 payload-offset: 加密数据的起始偏移uuid: 磁盘uuid
流程验证 TODO