HMAC-SHA1 in Rust
我正在尝试应用 HMAC-SHA1 以检查某些内容,但我无法使其正常工作。
这些是我的测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #[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")); } } |
我使用这个网站是为了通过使用一个字符串 (
如您所见,我正在尝试同时利用 rust-crypto 和 hmac-sha1 板条箱,并且我对它们都获得了相同的结果。
问题是这个结果与我在网站上得到的不匹配(
那么,很明显,我在这里遗漏了一些步骤,但我无法弄清楚,非常感谢您的帮助。
返回了正确的哈希值,它只是不在您期望的表示中。哈希作为原始字节返回,而不是作为转换为 ASCII 十六进制数字的字节。
如果我们将哈希码数组打印为十六进制,像这样:
1 | println!("{:02x?}", code); |
然后我们可以看到它与您的字符串匹配:
1 2 | [97, 04, 96, 23, b0, e5, d2, 0b, f6, be, b5, 31, 3d, 80, 60, 0e, 3d, 6a, be, 56] // 97049623b0e5d20bf6beb5313d80600e3d6abe56 |
而字符串
1 2 | [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,我们可以像这样将前者转换为后者:
1 2 3 | assert_eq!( COMPUTED_HMAC, code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string()); |