Rust sha1::Sha1 结果与 shasum (macOS) 不同

问题描述 投票:0回答:1

我正在通过

sha1
板条箱计算 Rust 中的 SHA1 摘要,并将这些值用作更大实用程序的一部分。

use sha1::{Digest, Sha1};

fn main() {
    for s in vec![
        "a",
        "string",
        "some text",
        "https://example.com",
    ] {
        compute_digest(s);
    }
}

fn compute_digest(s: &str) {
    let mut hasher = Sha1::new();
    hasher.update(s);
    let digest = hasher.finalize();
    println!("{s:20} -> {digest:x}");
}

输出:

a                    -> 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
string               -> ecb252044b5ea0f679ee78ec1a12904739e2904d
some text            -> 37aa63c77398d954473262e1a0057c1e632eda77
https://example.com  -> 327c3fda87ce286848a574982ddd0b7c7487f816

我创建了一个测试,将实际计算的键与预期值进行比较。使用

shasum
实用程序 (macOS) 计算的预期值如下。但输出与板条箱的结果不同。

echo "a" | shasum -a 1
# 3f786850e387550fdab836ed7e6dc881de23001b

echo "string" | shasum -a 1
# edbf08a562d55ca08be8d118430892695f28d432

echo "some text" | shasum -a 1
# a5c341bec5c89ed16758435069e3124b3685ad93

echo "https://example.com" | shasum -a 1
# 104f444c99548d6fcc870aeddf94096b790ff56e

这是为什么呢?我猜默认

Sha1::new()
实例和
shasum
的功能存在一些差异,但我无法理解它是什么。

rust hash sha1
1个回答
0
投票

原因是

echo
总是在输出中附加换行符。因此,您获得的
echo "a"
输出包含两个字节 0x61 和 0x0a,而 Rust 中的
a
哈希值仅计算字节 0x61。

如果您想在命令行验证这些,请使用

printf
代替。请注意,第一个参数包含格式字符串(就像
printf(3)
一样),因此如果您想包含百分号,则需要将其加倍或写入
printf '%s' "$ARGUMENT"

这样做可以使这项工作正常进行:

$ printf 'a' | shasum -a 1
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  -
$ printf 'a\n' | shasum -a 1
3f786850e387550fdab836ed7e6dc881de23001b  -

但请注意,SHA-1 不安全,不应在任何新软件中使用。如果您需要加密哈希函数,请改用 SHA-256(或任何 SHA-2、SHA-3 或 BLAKE2 哈希值)。

© www.soinside.com 2019 - 2024. All rights reserved.