当前位置: 首页 > 知识库问答 >
问题:

为PHP加密创建HMAC

晁绍辉
2023-03-14

我一直在考虑在PHP mcrypt加密中添加一个HMAC。

这仅仅是使用加密密钥用hash_hmac对加密数据进行散列并将其附加到加密数据上吗?然后在解密时,将HMAC拆分,hash_hmac用密钥将其余的数据再次拆分,并检查它与HMAC匹配。

我很困惑,因为在这个问题中,当认证密文时,应该hmaced什么?上面写着:

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

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

共有1个答案

姬昊焱
2023-03-14

简短回答:是的

长长的回答:

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

    null

算法+IV+密文+HMAC

如果您只对密文进行HMAC,攻击者将能够修改算法或IV(破坏文件),而不影响HMAC的有效性。这是很糟糕的,因为您最终可能会得到一个带有有效HMAC的损坏的加密文件。解密将会正常进行,因为您的软件会认为一切正常。结果是一个完全乱码的解密,但重点是你的软件坏了,因为它在解密时返回了错误的输出,并且没有给出任何错误。如果您的应用程序因为假设错误数据是正确的而试图对错误数据执行某些操作,那么这可以被归类为“安全风险”。它不是一个安全风险,因为它使基础加密更弱或更容易破解。HMAC和对称加密是两种完全不同的技术,做着不同的事情。使用HMAC的意义在于,您可以假设解密层返回的数据是100%正确的。

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

 类似资料:
  • 我在创建/使用在PHP中创建和使用的RSA密钥方面有一个问题。问题是,(公共和私人)密钥应该在不同的服务器之间交换(例如,当移动用户帐户时)。 现在,PHP的openssl库没有提供任何关于密钥创建格式的详细信息。最新文档位于http://php.net/manual/en/function.openssl-pkey-export.php只是声明它是“PEM格式”,但没有说明它是在PKCS#1还是

  • 问题内容: 我正在寻找一种将.txt文件加密为zip的方式,但是要采用安全的密码保护方式。我的目标是将此文件通过电子邮件发送给我,而任何人都无法阅读附件的内容。 有谁知道一种简单且最重要的安全方法来完成此任务?我可以创建zip归档文件,但是我不知道如何加密它们,或者它的安全性。 问题答案: 注意:此答案建议使用即使密码正确也已知不安全的加密方法。请查看评论链接和AES上的Winzip QA。php

  • 我想为这个方法生成的公钥创建文件 因为我正在为移动应用程序生成此密钥,而他们无法读取,所以他们请求文件,而不是作为字符串的公钥 请各位指教,,

  • 问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。

  • 我正在使用Maria JDBC驱动程序创建连接到Amazon Aurora DB我想创建一个安全的连接,所以我在这里阅读 使用MySQL实用程序通过SSL连接到DB群集 从https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem.下载Amazon RDS签名证书的公钥请注意,这将下载名为rds-combined-ca-bun

  • 问题内容: 我有一个正在下载xml并将其解析为sql数据库的应用程序。我的问题是,一旦部署了应用程序,xml中的数据就很容易被抓取,其他人可能将我辛苦赚来的数据用于自己的邪恶目的/应用程序。基本上我需要使用php加密xml,然后使用android解密。我已经看过几个php类,它们可以很容易地加密,但是我不完全确定哪种加密方法与android兼容。 解决后编辑: 起初,我认为出于某种原因我不得不忽略