#hash #key-hash #object #encryption-key #crypto

sthash

适用于大型数据的非常快速的加密散列函数

20个版本

0.2.15 2024年3月17日
0.2.14 2022年12月13日
0.2.12 2021年12月8日
0.2.11 2021年7月27日
0.2.3 2019年3月20日

#1066 in 密码学


用于 aegis

ISC 许可证

29KB
526

STHash

docs.rs

STHash是一种快速、带密钥的加密散列函数,旨在处理大型、可能不可信的数据。

另一方面,使用秘密密钥(或在此实现中,秘密种子)是强制性的。这不是一个通用散列函数。

STHash的典型用途是计算本地缓存的对象的密钥。

该构造依赖于

  • 两个 ε-几乎 ∆-通用函数 NH 和 Poly1305 的组合。请参阅Adiantum论文,以了解此组合的合理性。
  • cSHAKE函数作为XOF以推导NH、Poly1305和最终化密钥,以及KMAC生成最终标签。

当前代码是可移植的,用安全Rust编写,并且有很多优化空间。

然而,它已经在所有常见平台上始终比优化的BLAKE2bp和BLAKE3实现更快。

您可以期待未来版本将更快。

用法

use sthash::*;
use rand::{thread_rng, RngCore};

// This must be a random, secret seed.
let mut seed = [0u8; SEED_BYTES];
thread_rng().fill_bytes(&mut seed);

// The key constructor accepts an optional application name
// Different personalization strings produce different keys
// from the same `seed`.
let key = Key::from_seed(&seed, Some(b"Documentation example"));

// Another personalization string, such as the purpose of the
// `Hasher`, can be provided here as well.
let hasher = Hasher::new(key, None);

// Returns a 256-bit hash.
let h1 = hasher.hash(b"data");

// `Hasher` structures can safely be reused to hash more data.
let h2 = hasher.hash(b"data2");

基准测试

内置基准测试的测量结果,对1 Mb数据进行散列。使用cargo bench命令获取您自己的数据。

与BLAKE3(来自blake3)的比较

机器 BLAKE3(μs) STHash(μs) 比率
Apple M1, MacOS 646 119 5.4
AMD Zen2, Ubuntu 212 71 3.0
AMD Zen4 (Ryzen 7700), Ubuntu 148 61 2.4
Core i9 2.9Ghz, MacOS 226 86 2.6
ARMv8 (Freebox Delta), Debian Linux VM 3729 646 5.8

与BLAKE2bp(来自blake2b-simd)的比较

机器 BLAKE2bp(μs) STHash(μs) 比率
Core i9 2.9Ghz, MacOS 391 95 4.1
Core i7 2.8Ghz, MacOS 607 134 4.5
Xeon CPU E5-1650 v4 3.60GHz, Ubuntu Linux 479 130 3.7
Xeon CPU E3-1245 V2 3.40GHz, OpenBSD VM 2681 493 5.4
ARMv8 (Freebox Delta), Debian Linux VM 2949 668 4.4
ARMv8 (Raspberry Pi 4b), Raspbian 10496 3127 3.4
ARMv7 (Scaleway C1), Ubuntu Linux 29402 7871 3.7
ARMv7 (Raspberry Pi 3b), Raspbian 19596 4944 4
Atom C3955 2.10GHz (Scaleway Start1-XS), Linux 3709 886 4.2
AMD FX-6300, CentOS Linux 1812 737 2.5
AMD Zen4 (Ryzen 7700), Ubuntu 278 61 4.5

与HMAC-SHA2(来自rust-crypto)的比较

机器 HMAC-SHA512(μs) STHash(μs) 比率
Core i9 2.9Ghz, MacOS 2280 95 24
Core i7 2.8Ghz, MacOS 3233 134 24.1
Xeon CPU E5-1650 v4 3.60GHz, Ubuntu Linux 2600 130 20
Xeon CPU E3-1245 V2 3.40GHz, OpenBSD VM 6423 493 13
ARMv8 (Freebox Delta), Debian Linux VM 4587 668 6.9
ARMv8 (Raspberry Pi 4b), Raspbian 19864 3127 6.4
ARMv7 (Scaleway C1), Ubuntu Linux 167670 7871 21.3
ARMv7 (Raspberry Pi 3b), Raspbian 49309 4944 9.9
Atom C3955 2.10GHz (Scaleway Start1-XS), Linux 7052 886 8
AMD FX-6300, CentOS Linux 3700 737 5

算法

Km || Kp || Kn ← cSHAKE128(seed, c1)

Hp ← Poly1305(Kp, NH(Kn, pad128(M)))

H ← KMAC(Km, c2, pad64(|M|) || Hp)

NH使用4次遍历和2的步长进行实例化。

M以1 KB块处理,并在累积16个散列后(≡处理了16 KB的M)使用Poly1305压缩结果NH散列。

c1c2 是个性化字符串。

Kp 代表 Poly1305 随机密钥。在此上下文中,我们不需要与加密的随机数进行最终加法。

值以小端编码。

参考文献

感谢

此 crate 基于 Paul Crowley 和 Eric Biggers 的工作。

依赖项

~175KB