提问人:devforfu 提问时间:9/23/2023 最后编辑:cafce25devforfu 更新时间:9/23/2023 访问量:92
Rust sha1::Sha1 结果与 shasum 不同 [duplicate]
Rust sha1::Sha1 result is different from shasum [duplicate]
问:
我正在通过 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
答:
4赞
bk2204
9/23/2023
#1
原因是总是在输出中附加一个换行符。因此,你得到的输出包含两个字节 0x61 和 0x0a,而你在 Rust 中的哈希值只计算字节0x61。echo
echo "a"
a
如果要在命令行中验证这些内容,请改用。请注意,第一个参数包含一个格式字符串(就像 for 一样),因此如果要包含百分号,则需要将其加倍或写成 .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 哈希)。
评论
0赞
devforfu
9/23/2023
啊,这不是 echo 的换行符第一次咬我,但我又一次完全忘记了那个细微差别!谢谢!下次我需要精确的字符串表示时,我应该使用......(P.S.:是的,你对加密应用程序的看法是完全正确的;幸运的是,在我的情况下,它只用于从处理的URI创建唯一标识符。printf
评论
echo -n
不幸的是,它不是便携式的,并且在某些系统上从字面上打印. 更好,其行为是标准化的。-n
printf