#digest #hash #endianness #crypto

no-std digestible

Rust 更动态的 Hash 和 Hasher trait

5 个版本

0.2.2 2023年10月13日
0.2.1 2023年9月2日
0.2.0 2023年9月1日
0.1.0 2023年8月26日

#759 in 密码学

MIT/Apache

46KB
783

Digestible 构建状态 最新版本

Rust 更动态的 Hash 和 Hasher trait


与 Rust Hash 和 Hasher Traits 的关键区别

  • 内置 ByteOrder。因此,您可以使用任何字节顺序消化数字类型。 ByteOrder
  • 输出是一个泛型关联类型。因此,您可以将 Digest 集成到 ByteArray、String 中,使用 Base64 或 Digester 使用的任何类型。
  • 使用 #[digestible(skip)] 跳过字段
  • 使用 'digest_with' 和 'with' 覆盖默认的 digest 行为。 digest_with
  • 支持所有实现 digest::Digest 的哈希算法,如 SHA2、md-5 等。
  • 写入类型头以防止与类似类型冲突。(这是可选的,可以通过 #[digestible(type_header = none)] 禁用)

特性

  • no_std 支持
  • 将 Digest 实现为所有实现 digest::Digest 的类型的 Digester
  • 使用 digest_with 支持浮点数和原子类型

与 Hash 一起工作

对于未实现 Digestible 的类型

您可以将 #[digestible(digest_with = digest_with_hash)] 添加到您的变量中,以告诉Digestible使用Hash进行验证。

在Digestible中实现Hash。

#[digestible(hash)] 添加到您的结构体或枚举中,将为它实现Hash。使用验证函数。允许您拥有相同的Hash和Digestible。

使用SHA2的示例

#[derive(Digestible)]
pub struct MyStruct {
    pub id: u32,
    pub name: String,
    #[digestible(skip)]
    pub password: String,
}
fn digest_to_bytes(){
    let test = MyStruct{
        id: 0,
        name: "Test".to_string(),
        password: "Test".to_string(),
    };
    let mut hasher = sha2::Sha256::new();
    let result = hasher.digest_native(&test); // This will be the type of sha2 Output
}
fn digest_to_base64(){
    let test = MyStruct{
        id: 0,
        name: "Test".to_string(),
        password: "Test".to_string(),
    };
    let hasher = sha2::Sha256::new().into_base64();
    let result = hasher.digest_native(&test); // This is a base64 encoded string
}

依赖项

~355–660KB
~14K SLoC