Rust sha1::Sha1 结果与 shasum 不同 [duplicate]

Rust sha1::Sha1 result is different from shasum [duplicate]

提问人:devforfu 提问时间:9/23/2023 最后编辑:cafce25devforfu 更新时间:9/23/2023 访问量:92

问:

我正在通过 crate 计算 Rust 中的 SHA1 摘要,并将这些值用作更大实用程序的一部分。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

我创建了一个测试,将实际计算的键与预期值进行比较。使用实用程序 (macOS) 计算的预期值如下。但输出与板条箱的结果不同。shasum

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 哈希 SHA1

评论

0赞 bk2204 9/23/2023
echo -n不幸的是,它不是便携式的,并且在某些系统上从字面上打印. 更好,其行为是标准化的。-nprintf
0赞 kmdreko 9/23/2023
公平地说,无论如何,你的回答证实了我的怀疑

答:

4赞 bk2204 9/23/2023 #1

原因是总是在输出中附加一个换行符。因此,你得到的输出包含两个字节 0x61 和 0x0a,而你在 Rust 中的哈希值只计算字节0x61。echoecho "a"a

如果要在命令行中验证这些内容,请改用。请注意,第一个参数包含一个格式字符串(就像 for 一样),因此如果要包含百分号,则需要将其加倍或写成 .printfprintf(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 哈希)。

评论

0赞 devforfu 9/23/2023
啊,这不是 echo 的换行符第一次咬我,但我又一次完全忘记了那个细微差别!谢谢!下次我需要精确的字符串表示时,我应该使用......(P.S.:是的,你对加密应用程序的看法是完全正确的;幸运的是,在我的情况下,它只用于从处理的URI创建唯一标识符。printf