答案1
免责声明:我不是专家,但分享我在 RPi 上设置 dm-verity 时学到的知识。我将尝试解决问题 1 和 2。
例如,图中,如果树中已包含哈希0-0和哈希1,则可以立即验证数据块L2的完整性,方法是对数据块进行哈希处理,然后将结果与哈希0-0、哈希1、最后迭代组合。将结果与顶部哈希进行比较。类似地,如果树中已有哈希1-1和哈希0,则可以验证数据块L3的完整性。
设置 dm-verity 时,您将创建一个哈希树并将其存储在单独的分区上。然后系统可以验证正在读取的块
- 计算正在读取的块的哈希值
- 将计算出的哈希值与另一个块保存的哈希值相结合,以计算上层哈希值。
- 将这个上层哈希值与同一层保存的哈希值相结合来计算下一个上层哈希值。
- 重复直到计算出根哈希值
- 将计算出的根哈希值与保存的根哈希值进行比较
每次写入任何块时,您都需要更新存储的哈希树,以便继续能够检测篡改。
- 我想这取决于实现。但实施中cryptsetup-bin Debian 软件包正如第一部分中所解释的这个参考在启动时检查整个哈希值。 (这维基百科链接上面还解释了从块的哈希开始计算哈希树比计算单个块的哈希树比计算整个数据集的哈希更有效——我仍在试图弄清楚这一部分)。据我了解,您还可以将其配置为在每次读取时验证一个块(请参阅这个参考)。
答案2
这是它的工作原理图:https://source.android.com/security/verifiedboot/dm-verity
很可能是的。
/dev/dm* 设备属于设备映射器。说到 dm-verity,这可能会有所帮助:https://en.wikipedia.org/wiki/Device_mapper https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html