12 个版本 (5 个稳定版)
2.0.1 | 2024年5月13日 |
---|---|
2.0.0 | 2023年7月27日 |
1.1.0 |
|
1.0.2 | 2022年11月16日 |
0.2.0 | 2022年6月1日 |
#143 在 密码学 分类中
14,458 每月下载量
在 10 个 crate 中使用 (通过 stronghold_engine)
145KB
4K SLoC
Stronghold 新运行时
此 crate 提供多种方式在 ram、磁盘或非连续数据结构中安全地存储数据。所有这些类型的内存都实现了 LockedMemory
trait,这使得用户可以分配或解锁存储的数据。还提供了一个实现了基本安全措施的 Buffer
类型,用于临时存储任何计算中的数据。
Buffer
包含一些“最小”安全措施的内存,例如
- 保护区域
- Canaries
- 恒等时间比较
- 在释放时将内存清零
- 内存页的访问控制
- 系统标志以防止内存转储
受保护内存中的值以明文形式存储。可以通过通过 borrow()
或 borrow_mut()
获取引用来访问这些值。由于值以明文形式存储,因此 Buffer
的实例应该尽可能短暂。
Buffer
的主要功能是 alloc()
、borrow()
和 borrow_mut
。
LockedMemory
锁定内存用于存储敏感数据较长时间。
您可以使用 alloc
或通过 update
给它一个新的值来创建一个 LockedMemory
实例。正如特质的名称所暗示的,存储在 LockedMemory
中的数据是 锁定 的,您可以使用 unlock
来检索。解锁后的数据将以 Buffer
的形式返回。
当分配一个 LockedMemory
时,您必须选择它的存储方式和锁定方式。有 3 种类型实现了 LockedMemory
:RamMemory
、FileMemory
和 NonContiguousMemory
。
RamMemory
数据将以与 Buffer
类型相同的安保措施存储在内存中。此外,用户可以选择使用加密密钥对其数据进行加密。
注意:未加密数据的 RamMemory
实质上是 Buffer
类型的包装。
FileMemory
数据存储在磁盘内存中,可以进行加密。
保护文件的安保措施
- 文件访问控制(依赖于操作系统)
- 数据与噪声混合
- 当删除文件时,文件将被清零并删除
注意:通常磁盘内存比内存更易受攻击,但我们相信使用多种类型的内存可以提高数据安全性。
NonContiguousMemory
数据使用 Boojum 方案 分割成两个碎片。基本上,数据被分割成两个
- 一个碎片是随机数据
- 另一个碎片是第一个碎片的哈希值与数据的异或
通过将第二个碎片与第一个碎片的哈希值进行异或来重建数据。
非连续内存通过迫使攻击者恢复多个部分以获取原始数据来提高安全性。用户可以选择在内存中或内存和磁盘(以多样化内存存储)中分割数据。
此外,碎片可以定期 刷新。碎片的值将被单独修改,以便仍然可以重建原始数据。
注意:碎片中的数据与哈希摘要进行异或,因此非连续内存中存储的数据大小只能为哈希摘要的大小。这可能看起来很限制,但它在遵循下一节中描述的使用建议时非常适用。
使用建议
我们对如何使用该库来存储敏感数据的建议。
- 数据以加密形式存储在
RamMemory
中 - 加密密钥存储在跨越内存和磁盘的
NonContiguousMemory
中
因此,数据安全性取决于加密方案的力量和非连续内存中加密密钥的 '模糊化'。
目标
- 稳定的
LockedMemory
API - 实现
-
Buffer
-
RamMemory
-
FileMemory
- 数据与噪声混合
-
NonContiguousMemory
-
- 测试
- 功能正确性
- 安全性
- 清除
- 访问锁定内存
- 基准测试
- 无标准
依赖项
~4–43MB
~615K SLoC