Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树

上一篇说AVB内存装不下的较大分区(如文件系统)可能会使用哈希树,还提到了dm-verity。这篇来看看这两个是啥?

dm-verity

1、dm-verity

1、能不能将多个硬盘,映射成一个逻辑的硬盘,那样我们程序就不用关心复杂的地址问题了,也不用关系是哪个device了? DM-raid技术RAID全称为独立磁盘冗余阵列(Redundant Array of Independent Disks)

2、将某个地址段的数据进行加密,只有授权方式才可访问,比如FDE。 DM-crypt技术

3、访问存储介质上的数据时,校验下是否被篡改过。DM-verity技术。

DM就是Device-Mapper的缩写,也就说上述的想法都可以基于Device Mapper实现,Device Mapper可不仅仅实现了这些,还包括LVM2、DM-multipach等。

1.1 什么是Device Mapper?

dm-verity是内核子系统的Device Mapper中的一个子模块,所以在介绍dm-verity之前先要介绍一下Device Mapper的基础知识。

Device Mapper为Linux内核提供了一个从逻辑设备到物理设备的映射框架,通过它,用户可以定制资源的管理策略。当前Linux中的逻辑卷管理器如LVM2(Linux Volume Manager 2)、EVMS(Enterprise Volume Mageagement System)、dmraid等都是基于该机制实现的。(一堆陌生词汇,扫盲点安排上了)

Device Mapper有三个重要的概念:映射设备(Mapped Device)映射表目标设备(Target Device)
映射设备是一个逻辑块设备,用户可以像使用其他块设备那样使用映射设备。映射设备通过映射表描述的映射关系和目标设备建立映射。对映射设备的读写操作最终要映射成对目标设备的操作。而目标设备本身不一定是一个实际的物理设备,它可以是另一个映射设备,如此反复循环,理论上可以无限迭代下去。映射关系本质上就是表明映射设备中的地址对应到哪个目标设备的哪个地址。(无限套娃)

Device Mapper是一个灵活的架构,映射设备映射一个或多个目标设备,每个目标设备属于一个类型,类型不同,对I/O处理不同,构造目标设备的方法也不同。映射设备可以映射多个不同类型的目标设备。

Dm-verity规定只能有两个目标设备,一个是数据设备(Data Device),另一个是哈希设备(Hash Device);

Device Mapper可参考IBM博客:https://www.ibm.com/developerworks/cn/linux/l-devmapper/

1.2 dm-verity简介

dm-verity是Device mapper架构下的一种目标设备类型,通过它来保障设备或设备分区的完整性,它的典型架构是如图一。
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树_第1张图片

dm-verity类型的设备需要两个底层设备,一个是数据设备,顾名思义是用来存储数据,实际上就是要保障完整性的设备另一个是哈希设备,用来存储哈希值,在校验数据设备完整性时需要。
图中映射设备和目标设备是一对一关系,对映射设备的读操作被映射成对目标设备的读操作,在目标设备中,dm-verity又将读操作映射为数据设备(Data Device)的读操作。但是在读操作的结束处,dm-verity加了一个额外的校验操作,对读到的数据计算一个hash值,用这个哈希值和存储在哈希设备(Hash Device)中的值做比较,如果不同,则本次读操作被标记为错误。

假设数据设备和哈希设备中每块大小均为4KB,再假设使用hash算法SHA256,即每块数据的哈希值为32B(256bits),则哈希设备中的每块(4KB)存储有4096/32=128个哈希值。所以在layer0中一个哈希设备的块对应数据设备的128个块。到这里似乎完整了,数据设备中存储数据,哈希设备存储哈希值。

在读取数据时,dm-verity还要防备哈希设备中存储的哈希值被篡改的情况。

所以要加上layer1,在layer1中的每块数据对应layer0的128个块,layer1中的数据就是对layer0中的数据(hash设备和数据设备中的数据)计算hash值,如果layer1中只有一块,那么就此停止,否则继续增加layer,直到layer n只有一块。最后对layer n再计算hash值,称这个hash值为root hash。

这个root hash就可以反应数据设备和hash设备的变化。通过验证root hash 就可以校验数据是否被篡改。

简直是精妙啊!!!

哈希树(Merkletree)

2、哈希树(Merkletree)

我还以为hash树是hash-tree,哈哈哈哈

哈希树(hash tree;Merkle tree),在密码学及计算机科学中是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签 。哈希树能够高效、安全地验证大型数据结构的内容。哈希树的概念由瑞夫·墨克于 1979 年申请专利,故亦称墨克树(Merkle tree)。

Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树_第2张图片
哈希树的顶部为顶部哈希(top hash),亦称根哈希(root hash)或主哈希(master hash)。只要任一叶节点有变化,根哈希都会变。在比特币区块里,所有交易都按照Merkle Tree的格式组织起来,再跟区块头里的hashMerkleTreeRoot对应起来,就可以保证本区块交易信息的不可篡改。

接下来是时候看看AVB的详细工作了!!!

参考资料:
https://www.cnblogs.com/linhaostudy/archive/2018/01/17/7418289.html

你可能感兴趣的:(#,AVB,安全,学习,哈希算法,arm,Android)