首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生锈中的HMAC-SHA1

生锈中的HMAC-SHA1
EN

Stack Overflow用户
提问于 2019-02-11 02:23:36
回答 1查看 1.6K关注 0票数 5

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

以下是我的测试:

代码语言:javascript
复制
#[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是为了通过使用一个字符串(BODY_CONTENT)和一个密钥(KEY)来获得COMPUTED_HMAC

正如您所看到的,我正在尝试利用rust-cryptohmac-sha1板条箱,并且我对这两个板条箱都获得了相同的结果。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-11 02:41:30

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

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

代码语言:javascript
复制
println!("{:02x?}", code);

然后我们可以看到它与您的字符串匹配:

代码语言:javascript
复制
[97, 04, 96, 23, b0, e5, d2, 0b, f6, be, b5, 31, 3d, 80, 60, 0e, 3d, 6a, be, 56]
// 97049623b0e5d20bf6beb5313d80600e3d6abe56

而字符串"97049623b0e5d20bf6beb5313d80600e3d6abe56"看起来像这样:

代码语言:javascript
复制
[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,我们可以将前者转换为后者,如下所示:

代码语言:javascript
复制
assert_eq!(
    COMPUTED_HMAC,
    code.iter().format_with("", |byte, f| f(&format_args!("{:02x}", byte))).to_string());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54619582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档