如何安全地“清零”Rust BTreeMap

New*_*ode 1 memory struct rust btreemap

我想使用 Rust 的Zeroize箱来将 BTreeMap 条目归零。但 Zeroize 似乎没有为 BTreeMap 提供开箱即用的实现。

目前,我正在诉诸清除来删除地图的条目。

Q1. 只需清除存储在地图中的秘密而不将其归零有多安全?

Q2。我如何使用 Zeroize std::collection::BTreeMap?我想我必须迭代每个元素以将其归零。这种方法的另一个复杂性是我的地图包含“复杂”的通用结构。那么我必须将海龟一直归零吗?

Q2.a) 还有其他板条箱可以帮助我像我一样将 BTreeMap 归零吗?

我的结构例如:

let my_map1: BTreeMap<usize, MyStruct1<G1Projective>> = BTreeMap::new();

#[derive(Clone, Debug, Serialize, Deserialize)]
struct MyStruct1<G: MyTrait1 + MyTrait2> {
  #[serde(serialize_with: .., deserialize_with: ..)]
  field1: G,

  #[serde(serialize_with: .., deserialize_with: ..)]
  field2: Vec<G>,
}
Run Code Online (Sandbox Code Playgroud)

Jmb*_*Jmb 5

您不需要将包含秘密字段的结构的整个层次结构归零。您只需要Zeroize在现场本身实施即可。最简单的方法就是使用包装Zeroizing器,例如:

use zeroize::Zeroizing;

struct User {
    username: String,
    password: Zeroizing<String>,
};
Run Code Online (Sandbox Code Playgroud)

User然后,每当 a被销毁时(包括当您cleara BTreeMap,甚至只是让它超出范围时),密码都会被清除。

但请注意,简单地在 a 中存储任何类型的秘密BTreeMap本质上是不安全的,因为在映射中添加(或删除)项目可能会导致其他项目被重新分配或移动,并且在这种情况下原始内存位置不会被清除,只有最终的内存位置才会被清除。地图被清除或删除时的位置。

  • 为了详细说明我刚才所说的,在“BTreeMap”中存储“Zeroizing&lt;String&gt;”或“Zeroizing&lt;Vec&lt;_&gt;&gt;”应该没问题,因为“BTreeMap”本身不保存秘密数据,只保存一个参考它。然而,存储例如`Zeroizing&lt;[u8; 16]&gt;` 是不安全的,因为秘密数据直接保存在 `BTreeMap` 中。 (5认同)