【问题标题】:The result of HMAC<Sha256> differs from another implementationHMAC<Sha256> 的结果与另一个实现不同
【发布时间】:2019-01-08 04:28:10
【问题描述】:

我正在尝试使用 SHA256 实现 HMAC 验证以与 API 交互。我找到了hmacsha2 板条箱,根据他们的例子,它们可以完美地满足我的目的。

我有这个代码:

extern crate hmac;
extern crate sha2;

use hmac::{Hmac, Mac};
use sha2::{Digest, Sha256};

pub fn verify(message: &[u8], code: &[u8], key: &[u8]) -> bool {
    type HmacSha256 = Hmac<Sha256>;

    let mut mac = HmacSha256::new_varkey(key).unwrap();
    mac.input(message);

    let result = mac.result().code();
    return result == code;
}

#[cfg(test)]
mod tests {
    use verify;
    #[test]
    fn should_work() {
        assert!(verify(
          b"code=0907a61c0c8d55e99db179b68161bc00&shop=some-shop.myshopify.com&timestamp=1337178173",
          b"4712bf92ffc2917d15a2f5a273e39f0116667419aa4b6ac0b3baaf26fa3c4d20",
          b"hush"
        ), "Returned false with correct parameters!");
    }

    #[test]
    fn shouldnt_work() {
        assert!(
            !verify(
                b"things=things&stuff=this_is_pod_racing",
                b"3b3f62798a09c78hjbjsakbycut^%9n29ddeb8f6862b42c7eb6fa65cf2a8cade",
                b"mysecu)reAn111eecretB"
            ),
            "Returned true with incorrect parameters!"
        );
    }
}

cargo test 应该显示一个有效的 HMAC 验证和一个无效的验证。

很遗憾,verify 函数给出的结果与在线 HMAC 生成器的结果不一致。例如,使用消息code=0907a61c0c8d55e99db179b68161bc00&amp;shop=some-shop.myshopify.com&amp;timestamp=1337178173 和密钥hush,这个online HMAC 生成器指示哈希应该是4712bf92ffc2917d15a2f5a273e39f0116667419aa4b6ac0b3baaf26fa3c4d20,但这会导致我的测试失败,并且打印出结果确认哈希不是正确。

我已经确认我的字节字符串文字的结果确实是它们的 ASCII 等价物,否则我正在执行这个过程几乎与示例所展示的一样。

由于侧信道攻击,我不会在最终版本中使用result == code,这只是为了让我的调试工作更轻松一些。

Cargo.toml

[package]
name = "crypto"
version = "0.1.0"


[dependencies]
hmac = "0.6.2"
sha2 = "0.7.1"

【问题讨论】:

    标签: cryptography rust sha256 hmac


    【解决方案1】:
    4712bf92ffc2917d15a2f5a273e39f0116667419aa4b6ac0b3baaf26fa3c4d20
    

    这不应该被视为 ASCII 字节串。这是将原始字节十六进制编码 转换为易于人类阅读的格式。您需要正确匹配编码:

    extern crate hmac;
    extern crate sha2;
    extern crate hex;
    
    use hmac::{Hmac, Mac};
    use sha2::Sha256;
    
    pub fn verify(message: &[u8], code: &str, key: &[u8]) -> bool {
        type HmacSha256 = Hmac<Sha256>;
    
        let mut mac = HmacSha256::new_varkey(key).unwrap();
        mac.input(message);
    
        let result = mac.result().code();
    
        let r2 = hex::encode(&result);
    
        r2 == code
    }
    
    #[test]
    fn should_work() {
        assert!(verify(
            b"code=0907a61c0c8d55e99db179b68161bc00&shop=some-shop.myshopify.com&timestamp=1337178173",
            "4712bf92ffc2917d15a2f5a273e39f0116667419aa4b6ac0b3baaf26fa3c4d20",
            b"hush"
        ), "Returned false with correct parameters!");
    }
    
    #[test]
    fn shouldnt_work() {
        assert!(
            !verify(
                b"things=things&stuff=this_is_pod_racing",
                "3b3f62798a09c78hjbjsakbycut^%9n29ddeb8f6862b42c7eb6fa65cf2a8cade",
                b"mysecu)reAn111eecretB"
            ),
            "Returned true with incorrect parameters!"
        );
    }
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2012-10-12
      • 2020-10-18
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多