3个版本 (有重大变更)

使用旧Rust 2015

0.3.0 2018年10月8日
0.2.0 2017年12月30日
0.1.0 2017年12月18日

#1601 in 密码学


mrkl中使用

Apache-2.0/MIT

43KB
951

稳定结构化数据哈希

本库提供了特性和工具,以简化数据结构的稳定高等级哈希过程,与符合在crate digest中定义的API的加密哈希函数互操作。

动机

鉴于已经有更多通用的特性和框架可用于序列化和哈希应用数据,是否需要这个独立的特系统就出现了疑问。所提供功能试图解决的关键问题是适用于加密应用的适应性。

为什么不使用std::hash::Hash

标准特HashHasher被广泛应用于应用中,并且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 进行哈希选择会影响结果,尽管 charA 的实现细节,可能不易为应用程序开发者所见:她可能需要查看 a 的源代码(如果可用),或者在 AB 的序列化转储中找到它,该转储以人类可读的格式创建。

话虽如此,可能最终会提供一种用于加密哈希的 Serde 后端来序列化任意数据结构,其实现可以利用此包提供的服务。

无观点的哈希 API

此包提供的特性和其实现旨在寻求一个中间地带:它们使平台无关的摘要计算成为可能,同时避免任何隐式的数据表示选择。例如,IP 地址的哈希不是开箱即用的,因为表示格式原则上可能使用各种字节序,IPv4 和 IPv6 的混合方式并未固定,IPv6 地址的表示可能对不同数据单元及其端序做出不同选择。一些常用的表示选择通过在模块 personality 中定义的帮助函数提供。

许可

许可如下:

由您选择。

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献(根据 Apache-2.0 许可证定义),将根据上述条款双重许可,不附加任何额外条款或条件。

依赖关系

~455KB