【问题标题】:Is it safe to use a 128 bits key in HMAC-SHA256?在 HMAC-SHA256 中使用 128 位密钥是否安全?
【发布时间】:2012-08-25 19:10:57
【问题描述】:

Facebook 应用程序密钥是一个 32 个字符(0-9,a-f)的字符串,因此它表示一个 128 位字节数组。 Facebook uses this as the key to generate signed request using HMAC-SHA256。这是正确的用法吗?我认为 HMAC-SHA256 应该使用 256 位密钥。

【问题讨论】:

    标签: cryptography hmac


    【解决方案1】:

    如果密钥的长度大于哈希的内部块大小,HMAC 将 HASH(key) 用作密钥。因此,大于散列内部块大小的密钥不会提供比相同大小的密钥更好的安全性。根据 HMAC 规范,较短的键被零填充以等于散列的内部块大小。

    不可能将 128 位密钥与 HMAC-SHA-256 一起使用。如果您的意思是 128 位用零填充到 512 位,那么对于短期身份验证来说可能没问题。我建议至少 256 位,理想情况下你会希望使用等于底层哈希的内部块大小的东西。

    【讨论】:

    【解决方案2】:

    该页面显示 256 位 signature 来自 有效负载(Facebook 正在签名的内容)+您的 128 位 salt

    所以是的,这听起来像是正确的用法。

    秘密的 16 个字节(32 个字符)实际上并不是用于加密和解密某些东西的密钥。相反,它是用于更改数字签名结果的一些数据(盐),通过非常轻微地更改输入,以便只有知道确切秘密和确切有效负载的人才能创建签名。

    【讨论】:

    • 不,它使用PHP's hash_hmac function,其中第三个参数是$secret。看到这条线$expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    • Returns a string containing the calculated message digest。消息摘要与签名相同,在这种情况下,术语 keysalting 的概念同义。查看en.wikipedia.org/wiki/Hash-based_message_authentication_code 表明 key 在散列之前连接到有效负载上。
    • 秘密的 128 位强度意味着这一点。如果有人试图猜测您的秘密并以欺诈方式签署恶意有效载荷以假装它们来自 Facebook,您将从这种优势中受益。散列函数产生的位数并不严格相关。
    • 你说得对,我的意思是 128 除以 8,但写了 32 个字节(更新前)。
    • @antak 消息摘要与签名不同。我认为您将它与 HMAC 提供的消息身份验证代码混淆了。此外,HMAC 密钥是密钥而不是盐,它是使用规范中描述的混合功能集成的;除非它是 HMAC 的不正确实现,否则它不仅仅是前置。最后它看起来像一个双盐机制,但事实并非如此。我建议阅读其背后的安全证明以了解更多详细信息。
    猜你喜欢
    • 2010-11-24
    • 2014-07-19
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多