Rust HMAC-SHA1防锈剂

Rust HMAC-SHA1防锈剂,rust,cryptography,hmac,hmacsha1,Rust,Cryptography,Hmac,Hmacsha1,我正在尝试应用HMAC-SHA1以检查一些内容,但我无法使其工作 以下是我的测试: #[cfg(test)] mod tests { use crypto::hmac::Hmac; use crypto::mac::Mac; use crypto::sha1::Sha1; use std::str::from_utf8; const BODY_CONTENT: &'static str = r#"bodystring"#; const

我正在尝试应用HMAC-SHA1以检查一些内容,但我无法使其工作

以下是我的测试:

#[cfg(test)]
mod tests {

    use crypto::hmac::Hmac;
    use crypto::mac::Mac;

    use crypto::sha1::Sha1;
    use std::str::from_utf8;

    const BODY_CONTENT: &'static str = r#"bodystring"#;
    const KEY: &[u8] = b"secret_key";
    const COMPUTED_HMAC: &'static str = "97049623b0e5d20bf6beb5313d80600e3d6abe56";

    #[test]
    fn test_hmac_sha1() {
        let mut mac= Hmac::new(Sha1::new(), KEY);
        mac.input(BODY_CONTENT.as_bytes());
        let result = mac.result();
        let code = result.code();
        assert_eq!(COMPUTED_HMAC.as_bytes(), code);
        assert_eq!(COMPUTED_HMAC, from_utf8(&code).unwrap_or("failed"));
    }

    #[test]
    fn test_hmac_sha1_direct() {
        let hash = hmacsha1::hmac_sha1(KEY, BODY_CONTENT.as_bytes());
        assert_eq!(COMPUTED_HMAC.as_bytes(), hash);
        assert_eq!(COMPUTED_HMAC, from_utf8(&hash).unwrap_or("failed"));
    }
}
我使用它是为了通过使用一个字符串(
BODY\u CONTENT
)和一个密钥(
key
)获得
计算的\u HMAC

正如你所看到的,我试图利用这两个和板条箱,我用它们得到了相同的结果

问题是,这个结果与我在网站上得到的结果不匹配(
97049623b0e5d20bf6beb5313d80600e3d6abe56
),测试失败。你可能会认为这个网站是错误的,但事实并非如此,因为我用它来验证Github生成的一些其他哈希值(我在Github应用程序中工作),它是有效的


然后,很明显,我在这里遗漏了一些步骤,但我无法理解,我非常感谢您的帮助。

返回了正确的哈希值,只是它不是您期望的表示形式。散列返回为原始字节,而不是转换为ASCII十六进制数字的字节

如果我们将哈希码数组打印为十六进制,如下所示:

println!("{:02x?}", code);
assert_eq!(
    COMPUTED_HMAC,
    code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string());
然后我们可以看到它与您的字符串匹配:

[97、04、96、23、b0、e5、d2、0b、f6、be、b5、31、3d、80、60、0e、3d、6a、be、56]
//97049623b0e5d20bf6beb5313d80600e3d6abe56
而字符串“97049623b0e5d20bf6beb5313d80600e3d6abe56”如下所示:

println!("{:02x?}", code);
assert_eq!(
    COMPUTED_HMAC,
    code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string());
[39,37,30,34,39,36,32,33,62,30,65,35,64,32,30,62,66,36,62,65,
62, 35, 33, 31, 33, 64, 38, 30, 36, 30, 30, 65, 33, 64, 36, 61, 62, 65, 35, 36]
使用,我们可以将前者转换为后者,如下所示:

println!("{:02x?}", code);
assert_eq!(
    COMPUTED_HMAC,
    code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string());

谢谢你的回答!我在兜圈子。最后,正如您所建议的那样,只需将结果哈希重新编码为十六进制就可以了。我曾经对它进行编码。