PHP mcrypt_decrypt - 我可以确定数据是否使用正确的密钥解密?

发布于 2024-12-03 07:23:16 字数 276 浏览 0 评论 0原文

我正在编写一个 php 脚本,并使用 mcrypt 来加密/解密任意数据。

当我使用另一个密钥解密加密数据时(例如,我输入了错误的密码),输出当然不会被正确解密。

如果使用了错误的密钥,我想显示一条错误消息,但我认为很难将输出字符串验证为正确的“明文”(因为编码数据中的字符作为输入数据也是有效的)。

有什么办法可以解决这个问题吗?


当我写这个问题时,我有了一个想法:)

我是否可以在输入数据前面加上静态“控制”字符串,并在解密时使用它进行验证?

I'm working on a php script and are using mcrypt to encrypt/decrypt arbitrary data.

When I decrypt encrypted data, using another key (e.g. I typed in the wrong password), the output won't be correctly decrypted of course.

If the wrong key has been used I would like to display an error message, but I'm thinking it's quite hard to validate the output string as correct "plaintext" (since the chars in the encoded data are also valid as input data).

Is there any way to get around this?


As I was writing this question, I got an idea :)

Could I possibly prefix the input data with a static "control" string and use this for validation when I decrypt?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

云之铃。 2024-12-10 07:23:16

我通常这样做:

  • 对输入数据(文件或消息或其他任何内容)进行哈希处理。
  • 加密数据。
  • 在加密数据前面添加 IV 和数据的哈希值。
  • 发送或存储 IV + 哈希 + 密文。

由于 IV 和散列的长度始终相同,因此无需添加填充或控制字符。

在接收或读取端:

  • 提取 IV。
  • 提取哈希值。
  • 提取并解密加密文本。
  • 对解密的数据进行哈希处理并检查其是否与提取的哈希值匹配。

因此,您存储源数据的哈希值,而不是密钥的哈希值。正如上面发表的评论者所说,泄露密钥的哈希值是一个漏洞,因为攻击者现在只需要在彩虹表中搜索它(它会在几秒钟内危及您的数据)。

存储控制字符串的想法也很好(当然更快),但它不能让您确认消息或数据确实未损坏,只能使用正确的密钥。

I usually do this:

  • Hash the input data (file or message or whatever).
  • Encrypt the data.
  • Prepend the encrypted data with the IV and the hash of the data.
  • Send or store the IV + hash + ciphertext.

As the IV and hash are always the same length, there is no need to add padding or control characters.

On the receiving or reading side:

  • Extract the IV.
  • Extract the hash.
  • Extract and decrypt the encrypted text.
  • Hash the decrypted data and check if it does match the extracted hash.

So, you store the hash of the source data, NOT the hash of the key. As a commenter posted above, giving away the hash of your key is a vulnerability, as the attacker now needs only to search it in a rainbow table (it would compromise your data in a matter of seconds).

You idea of storing a control string is good too (certainly is faster) but it cannot allow you to confirm the message or data is indeed uncorrupted, only that the correct key was used.

孤独难免 2024-12-10 07:23:16

为加密数据添加完整性的最佳方法是添加仅在加密数据上创建的 MAC。

不要对纯文本应用 MAC,因为 MAC 可以泄露有关该文本的一些信息。 MAC 的创建并不是为了提供安全性,而是为了提供完整性。

所以,正确的算法是 ENCRYPT-THEN-MAC!

在此视频中提供了更多详细信息 http://d396qusza40orc.cloudfront.net/crypto/recoded_videos%2F7.4%20%5B974a4c90%5D%20.mp4

The best way to add integrity to you encrypted data is to add MAC created ONLY on encrypted data.

Don't apply MAC on plain text, because MAC can reveal some information about that text. MAC is not created to provide security - only integrity.

So, right algorithm would be ENCRYPT-THEN-MAC!

More detailed information is available in this video http://d396qusza40orc.cloudfront.net/crypto/recoded_videos%2F7.4%20%5B974a4c90%5D%20.mp4

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文