为PHP加密创建HMAC

为PHP加密创建HMAC,php,encryption,Php,Encryption,我一直在考虑向PHP mcrypt加密添加HMAC 这是否只是使用加密密钥使用hash_hmac对加密数据进行散列并将其附加到加密数据中?然后在解密时分离HMAC,再次使用密钥对其余数据进行散列,并检查它是否与HMAC匹配 我很困惑,因为在这个问题上它说: 您必须在HMAC输入中包括影响解密过程的所有内容,即不仅包括加密结果本身,还包括用于该加密的IV,并且,如果整个协议支持算法敏捷性,您还应该输入加密算法的规范(否则,攻击者可能会更改消息的标题,将标有“AES-256”的标记替换为标有“AES

我一直在考虑向PHP mcrypt加密添加HMAC

这是否只是使用加密密钥使用hash_hmac对加密数据进行散列并将其附加到加密数据中?然后在解密时分离HMAC,再次使用密钥对其余数据进行散列,并检查它是否与HMAC匹配

我很困惑,因为在这个问题上它说:

您必须在HMAC输入中包括影响解密过程的所有内容,即不仅包括加密结果本身,还包括用于该加密的IV,并且,如果整个协议支持算法敏捷性,您还应该输入加密算法的规范(否则,攻击者可能会更改消息的标题,将标有“AES-256”的标记替换为标有“AES-128”的标记,而您可能会在不知不觉中使用错误的算法进行解密)


是这样吗?如果这是真的,为什么仅仅对加密数据使用hash_hmac还不够?

简短回答:是

长答案

是基于散列的消息身份验证代码。您应该HMAC任何您想要验证的内容,或者换句话说,任何您想要防止被修改的内容

虽然HMAC更为复杂,但将其视为咸杂烩可能是有道理的

e、 g.hmac(消息,键)=散列(消息+键)

  • 您只能使用相同的消息和键重新创建相同的hmac
  • 如果密钥相同但消息不同,则无法重新创建相同的hmac
  • 如果消息相同但密钥不同,则无法重新创建相同的hmac
  • 攻击者(没有HMAC密钥)在不使现有HMAC无效的情况下,无法修改HMAC消息的一部分。这确实取决于您的数据格式和该数据的使用情况,以确定HMAC消息和HMAC密钥中应包含的内容。但是,假设您使用HMAC对解密进行身份验证,则您应始终包含在HMAC消息中解密所依赖的任何内容。对称密钥通常用作HMAC密钥

    在你的引文中,海报说IV和算法也应该被哈希。考虑一个由

    组成的文件/数据库格式。 算法+IV+密文+HMAC

    如果仅HMAC加密文本,攻击者将能够修改算法或IV(破坏文件)不影响HMAC的有效性。这是不好的,因为您可能会得到一个带有有效HMAC的已损坏加密文件。解密将正常进行,因为您的软件会认为一切正常。结果是一个完全乱码的解密,但关键是您的软件被破坏,因为它返回了错误的输出,而n解密并且没有给出任何错误。如果您的应用程序试图处理错误数据,因为它假定数据是正确的,那么这可以被归类为“安全风险”
    。它不是一种安全风险,因为它会使基础加密更弱或更容易破解。HMAC和对称encr加密是两种完全不同的技术,可以做不同的事情。使用HMAC的目的是假设解密层返回的数据是100%正确的

    在上面的例子中,算法是一段动态数据,我用它来解释“算法敏捷性”在OPs引用中。它定义了使用的加密算法。重点是它是动态的,因此需要从某处读取而不是硬编码。这一事实使它成为解密的依赖项,因此它应该包含在HMAC消息中。但是,如果您总是使用一些>静态算法,则它应该由(硬编码到)您的解密代码假定,并且无论如何不需要存储此数据。不需要在HMAC消息中包含静态数据,因为它对解密没有影响


    使用静态算法的文件格式的一个示例是。该算法是一致的,因此始终假定它是一致的。出于速度原因,它实际上使用2个HMAC。1用于验证IV和密钥,2用于验证加密数据部分。

    如果加密库检查ll字节的填充。如果填充中甚至有一个错误,它可能会引发异常或类似的情况。HMAC会阻止您在其损坏时进行解密。根据使用的填充,通过检查有效填充进行身份验证几乎总是不如使用HMAC可靠。它可能会随机创建有效的填充“这很糟糕,因为你最终可能会得到一个带有有效HMAC的已损坏加密文件。”但这不会带来任何安全风险,对吗?如何使用加密/解密层在这里很重要。通常,软件中的假设是错误的。如果应用程序代码假设解密成功并对错误数据起作用,则可能是无害的,也可能是非常糟糕的。无论是“安全风险”取决于您的定义,但它肯定会被归类为存在于加密/解密层的问题。但不,这不是一种安全风险,如果您是这样问的话,它会使破解底层加密变得更容易。没问题。我已经尝试合并了我们在这里讨论的所有内容。谢谢