HMAC-SHA1鲁斯特

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

我想,以检查一些内容应用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"));
    }
}

我为了使用一个字符串(website)和秘密密钥(COMPUTED_HMAC)来获得BODY_CONTENT使用该KEY

正如你所看到的,我想充分利用这两种rust-cryptohmac-sha1包装箱我得到与他们两个相同的结果。

问题是,这种结果不匹配什么我在网站(97049623b0e5d20bf6beb5313d80600e3d6abe56)获取和测试失败。你可能会认为该网站是错误的,但事实并非情况下,我用它来验证通过Github上产生了一些其他的哈希值(我在Github上应用程序的工作)和它的作品。

然后,很明显,我在这里缺少一些的一步,但我无法弄清楚,我会很感激你的帮助。

rust cryptography hmac hmacsha1
1个回答
3
投票

正确的散列返回,它只是没有在您预期的表现。散列返回为原始字节,而不是作为转换成ASCII的十六进制数字字节。

如果我们打印的哈希码阵列为十六进制,就像这样:

println!("{:02x?}", code);

那么我们可以看到,它的字符串相匹配:

[97, 04, 96, 23, b0, e5, d2, 0b, f6, be, b5, 31, 3d, 80, 60, 0e, 3d, 6a, be, 56]
// 97049623b0e5d20bf6beb5313d80600e3d6abe56

而串"97049623b0e5d20bf6beb5313d80600e3d6abe56"看起来是这样的:

[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]

使用itertools,我们可以把前者转换为这样的后者:

assert_eq!(
    COMPUTED_HMAC,
    code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string());
© www.soinside.com 2019 - 2024. All rights reserved.