3个版本 (有重大变更)
使用旧Rust 2015
0.3.0 | 2018年10月8日 |
---|---|
0.2.0 | 2017年12月30日 |
0.1.0 | 2017年12月18日 |
#1601 in 密码学
在mrkl中使用
43KB
951 行
稳定结构化数据哈希
本库提供了特性和工具,以简化数据结构的稳定高等级哈希过程,与符合在crate digest中定义的API的加密哈希函数互操作。
动机
鉴于已经有更多通用的特性和框架可用于序列化和哈希应用数据,是否需要这个独立的特系统就出现了疑问。所提供功能试图解决的关键问题是适用于加密应用的适应性。
为什么不使用std::hash::Hash
?
标准特Hash
和Hasher
被广泛应用于应用中,并且Hash
实现很容易推导。然而,这些特性是为了支持进程内的哈希表集合而设计的,因此它们不便于机器和语言无关的哈希。可以自由地对isize
/usize
值进行哈希,并且许多数据类型的表示被视为实现细节:例如,字节切片的Hash
实现既依赖于目标架构,又不同于将切片内容按顺序输入到等效的Hasher
中。
Serde有什么问题?
Serde是一个功能完善的数据序列化框架,旨在通用适用。它被广泛使用,并推荐为在Rust生态系统中对数据类型实现序列化的方式。Serde的设计有利于实现定义良好、跨平台的数据表示。然而,由于它是一个通用框架,适合于加密数据签名和验证的Serializer
实现必须做出数据表示的选择来适应Serde的通用数据模型,或者制定一种策略来处理任何Serialize
实现使用时可能出现的不想要或不受支持的特性。这些选择的配置与特定类型的Serialize
实现解耦。
考虑以下场景
// crate a
#[derive(Serialize)]
pub struct A {
foo: char
}
// crate b
extern crate a;
#[derive(Serialize)]
pub struct B {
bar: a::A
}
希望通过假设的 Serializer
后端计算 B
的哈希的应用程序需要知道,如何对内部 char
进行哈希选择会影响结果,尽管 char
是 A
的实现细节,可能不易为应用程序开发者所见:她可能需要查看 a
的源代码(如果可用),或者在 A
或 B
的序列化转储中找到它,该转储以人类可读的格式创建。
话虽如此,可能最终会提供一种用于加密哈希的 Serde 后端来序列化任意数据结构,其实现可以利用此包提供的服务。
无观点的哈希 API
此包提供的特性和其实现旨在寻求一个中间地带:它们使平台无关的摘要计算成为可能,同时避免任何隐式的数据表示选择。例如,IP 地址的哈希不是开箱即用的,因为表示格式原则上可能使用各种字节序,IPv4 和 IPv6 的混合方式并未固定,IPv6 地址的表示可能对不同数据单元及其端序做出不同选择。一些常用的表示选择通过在模块 personality
中定义的帮助函数提供。
许可
许可如下:
- Apache 许可证 2.0 版(《LICENSE-APACHE》或《http://www.apache.org/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或《http://opensource.org/licenses/MIT》)
由您选择。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献(根据 Apache-2.0 许可证定义),将根据上述条款双重许可,不附加任何额外条款或条件。
依赖关系
~455KB