Why do I get incorrect values when implementing HMAC-SHA256?
我正在尝试在Rust中创建一个函数,该函数将返回HMAC-SHA256摘要。 我一直在根据Wikipedia和RFC 2104进行描述。
我一直在努力返回正确的HMAC。 我正在为SHA256摘要使用环,但是无论我如何尝试,我似乎都无法获得正确的结果。 我怀疑这可能与
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 31 32 33 34 | extern crate ring; use ring::{digest, test}; pub fn hmac(k: Vec<u8>, mut m: Vec<u8>) -> Vec<u8> { // Initialize ipad and opad as byte vectors with SHA256 blocksize let ipad = vec![0x5C; 64]; let opad = vec![0x36; 64]; // iround and oround are used to seperate the two steps with XORing let mut iround = vec![]; let mut oround = vec![]; for count in 0..k.len() { iround.push(k[count] ^ ipad[count]); oround.push(k[count] ^ opad[count]); } iround.append(&mut m); // m is emptied here iround = (digest::digest(&digest::SHA256, &iround).as_ref()).to_vec(); oround.append(&mut iround); // iround is emptied here oround = (digest::digest(&digest::SHA256, &oround).as_ref()).to_vec(); let hashed_mac = oround.to_vec(); return hashed_mac; } #[test] fn test_hmac_digest() { let k = vec![0x61; 64]; let m = vec![0x62; 64]; let actual = hmac(k, m); // Expected value taken from: https://www.freeformatter.com/hmac-generator.html#ad-output let expected = test::from_hex("f6cbb37b326d36f2f27d294ac3bb46a6aac29c1c9936b985576041bfb338ae70").unwrap(); assert_eq!(actual, expected); } |
这些是摘要:
1 2 3 | Actual = [139, 141, 144, 52, 11, 3, 48, 112, 117, 7, 56, 151, 163, 65, 152, 195, 163, 164, 26, 250, 178, 100, 187, 230, 89, 61, 191, 164, 146, 228, 180, 62] Expected = [246, 203, 179, 123, 50, 109, 54, 242, 242, 125, 41, 74, 195, 187, 70, 166, 170, 194, 156, 28, 153, 54, 185, 133, 87, 96, 65, 191, 179, 56, 174, 112] |
如评论中所述,您已将字节替换为内部和外部填充。 返回到Wikipedia页面:
1 2 | o_key_pad = key xor [0x5c * blockSize] //Outer padded key i_key_pad = key xor [0x36 * blockSize] //Inner padded key |
这是我对该函数的看法。 我相信它的分配较少:
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 31 32 33 | extern crate ring; use ring::{digest, test}; const BLOCK_SIZE: usize = 64; pub fn hmac(k: &[u8], m: &[u8]) -> Vec<u8> { assert_eq!(k.len(), BLOCK_SIZE); let mut i_key_pad: Vec<_> = k.iter().map(|&k| k ^ 0x36).collect(); let mut o_key_pad: Vec<_> = k.iter().map(|&k| k ^ 0x5C).collect(); i_key_pad.extend_from_slice(m); let hash = |v| digest::digest(&digest::SHA256, v); let a = hash(&i_key_pad); o_key_pad.extend_from_slice(a.as_ref()); hash(&o_key_pad).as_ref().to_vec() } #[test] fn test_hmac_digest() { let k = [0x61; BLOCK_SIZE]; let m = [0x62; BLOCK_SIZE]; let actual = hmac(&k, &m); // Expected value taken from: https://www.freeformatter.com/hmac-generator.html#ad-output let expected = test::from_hex("f6cbb37b326d36f2f27d294ac3bb46a6aac29c1c9936b985576041bfb338ae70").unwrap(); assert_eq!(actual, expected); } |