代码之家  ›  专栏  ›  技术社区  ›  Bishal Kumar Shrestha

经过AES-128和HMAC的两个不同输入的输出冲突概率

  •  0
  • Bishal Kumar Shrestha  · 技术社区  · 10 年前

    我需要为我的每个输入生成一个唯一的输出字符串,这也是密码安全的。

    我当前正在使用 https://github.com/defuse/php-encryption 作为库,首先加密然后散列我的输入。 根据该库的自述文件,“消息在CBC模式下使用AES-128加密,并使用HMAC-SHA256(先加密后Mac)进行身份验证。PKCS7填充用于将消息填充为块大小的倍数。HKDF用于将用户提供的密钥拆分为两个密钥:一个用于加密,另一个用于身份验证。它使用 openssl_ hash_hmac 功能。”

    因为每次运行算法时输出都不同。据我所知,这是因为加密阶段的IV不同。所以我的问题是,两个不同的输入和同一个键是否会发生输出冲突。

    i、 e.罐 HMAC(K2, AES-128(M1, K, IV1)) == HMAC(K2, AES-128(M2, K, IV2)) 是真的吗?

    2 回复  |  直到 10 年前
        1
  •  0
  •   Scott Arciszewski    10 年前

    所以我的问题是,两个不同的输入和同一个键是否会发生输出冲突。

    i、 e.罐 HMAC(K2, AES-128(M1, K, IV1)) == HMAC(K2, AES-128(M2, K, IV2)) 是真的吗?

    是的,这是可能发生的,但在SHA256中没有任何新发现的弱点的情况下,概率可以忽略不计(数量级:10^38中的一个)。

    理论攻击者更感兴趣的是:对于128位IV birthday collision 是2^64中的1。如果你能说服攻击者使用这个库加密大约18000000000000000000个数据块(这个数字高得离谱,远远超出了当今大多数攻击者的能力范围),你会得到一个IV重复(概率为50%)。

    大多数AES密钥只能用于加密小于2^50字节的数据,因此这对大多数人来说并不是一个实际问题。然而,出于脊椎穿刺安全的考虑,我对Defuse的加密库版本实施了一种变通方法:

    该库已经使用HKDF-SHA256将密钥拆分为两个密钥:

    • 加密密钥(用于AES)
    • 身份验证密钥(用于HMAC)

    在第2版中,除了CTR模式的128位随机随机数外,库还将为HKDF生成256位随机盐。这意味着,即使在IV中发生生日冲突,AES(和HMAC)密钥也不会相同,因此不会泄露任何信息。

    为了获得有用的碰撞,您需要128位nonce和256位HKDF salt相同。这给了我们384位的喘息空间,而安全性仍然取决于256位的“主”密钥(图书馆用户管理的密钥)。

    简而言之,生日冲突的50%发生在2^192条消息之后,而不是2^64条消息之后。

        2
  •  0
  •   Community Mohan Dere    8 年前

    由于HMAC的输入每次都不同,因此抗冲突性与底层哈希函数的抗冲突性相同。对于SHA-256,概率为 2 -n/2 = 2 -128 哪里 n 是输出大小(假设完整输出用作身份验证标记)。这仍然(可能)超出了我们目前的寿命。需要注意的是 n/2 而不仅仅是 n个 因为生日问题可以应用于碰撞阻力。

    需要注意的是,HMAC在此处的预期用途不应使用 collision resistance ,而是 preimage resistance 记住,概率实际上要低得多。因此,在当前可用的攻击下,使用HMAC-MD5仍然是安全的,但是 a better attack can come along which might break that .HMAC-SHA256是当前和(近期)的安全选择。