hash - 为什么在使用 decl_storage 时 `blake2_256` 无法防止 StorageDoubleMap 中的 "first key pair"受到损害?

标签 hash rust substrate

decl_storage!是一个“程序宏”,用于存储数据以使其在后续 block 中可用。

它表示如果用户能够在 double_map 中设置第一个 key 对,那么我们就不能信任该 key 对,因此我们必须使用加密哈希器例如 blake2_256 以防止“所有存储项的其他值受到损害”。

接着说,如果用户能够在double_map中设置第二个 key 对,那么我们就不能信任该 key 对,所以我们必须使用加密哈希器(例如 blake2_256)来防止“存储中具有相同第一个 key 的其他项目被泄露”。

关于第一 key 对,为什么说只是为了防止“所有存储项的其他值被泄露”blake2_256 不是也用于防止第一个 key 对本身被泄露(而不仅仅是“其他值”)吗?

最佳答案

假设 module1.someValue 的哈希值是 0x12345678

module2.doubleMapValue.firstKey(value1) 的哈希值为 0x1234

module2.doubleMapValue.secondKey(value2) 的哈希值为 0x5678

这意味着 module2.doubleMapValue.fullKey(value1, value2)module1.someValue 具有相同的哈希值。即这些值存储在同一位置。

如果用户能够控制module2.doubleMapValue的两个键并计算出value1value2的值,那么他们将能够覆盖 module1.someValue 的值并导致安全问题。

这就是为什么如果值由用户控制,则 double map 的 key1 的哈希函数需要是加密哈希函数。否则,用户可能能够制作value1,使其与所有其他模块的存储发生冲突,从而损害它们。

如果用户无法控制 key2,double map 提供了清除所有带有 hash(key1) 前缀的键的功能,该功能也可能被劫持造成麻烦。

关于hash - 为什么在使用 decl_storage 时 `blake2_256` 无法防止 StorageDoubleMap 中的 "first key pair"受到损害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237091/

相关文章:

ruby-on-rails - 何时使用 Hashie::Mash?

hashmap - 如何有效地从 HashMap 中查找和插入?

rust - 如何消除委托(delegate)给HashMap迭代器时的 "expected &T, found type parameter"错误?

rust - 是否有理由在 Substrate 中对特定类型使用通用特征?

c# - 如何在数据库中存储散列密码

c++ - 从 boost::hash 获取 32 位哈希值

hash - 选择哈希函数

enums - 修改选项的值并获取引用

rust - decl_storage 中 `storage_name` 的示例是什么

rust - 如何从 Substrate 端从 Polkadot 地址生成公钥