【问题标题】:How to debug/investigate corrupted encrypted data?如何调试/调查损坏的加密数据?
【发布时间】:2018-10-17 12:14:50
【问题描述】:

我有一个代码库,可以在数据库中存储一些敏感数据。在将数据存储到数据库之前,我使用this Crypto library (docs here) 对数据进行加密。

要解密它,我使用以下内容

use \Defuse\Crypto\Crypto;
use \Defuse\Crypto\Exception as Ex;

// The following is inside a class, but for clarity I only copy pasted this part    

try {
    return Crypto::decrypt($aStr, Crypt::$cryptoKey);

} catch (Ex\InvalidCiphertextException $ex) { // VERY IMPORTANT
    // Either:
    //   1. The ciphertext was modified by the attacker,
    //   2. The key is wrong, or
    //   3. $ciphertext is not a valid ciphertext or was corrupted.
    // Assume the worst.
    die('The ciphertext has been tampered with! Message:'.$ex->getMessage());
}
// I've got some more catch blocks here but they're not relevant for this question

这段代码很好用,但是今天我偶然发现了一条数据库记录,它让整个事情在这个InvalidCiphertextException catch 上死掉了。我已经用一些示例代码手动尝试过,但我总是得到InvalidCiphertextException

我认为数据已损坏,但我不确定是否是这种情况。

该记录在一个有 15000 条记录的表的中间,这些记录都很好,并且这部分代码已经很久没有突然更改了。

我还能做些什么来调查(甚至解密)这个?或者我能找到更多关于这条记录的信息或进一步调试它的方法吗?

欢迎所有提示!

【问题讨论】:

  • 尝试将其与简单且较小的记录一起使用。或者一个一个打印密文字节。但是,我想知道该库如何以任何方式知道密文已被攻击者修改?
  • @Kianii - 我真的无法用更简单和更小的记录来尝试它。这一张唱片是唯一给我带来麻烦的唱片。据我所知(但我可能是错的),也无法逐个验证加密字节,因为加密字节的完整性是作为一个整体进行测试的。欢迎任何其他提示。
  • 我的意思是它可能与记录的大小有关(例如,我不知道,所以尝试分析为什么这是唯一不起作用的记录)。我不知道您对数据究竟做了什么,但您可能对所有记录使用相同的格式/编码/其他。似乎从一条记录到另一条记录的唯一参数是大小。还有,你误会了。你是对的,你不能一个一个地验证加密的字节,但我不是在谈论验证而是打印。打印您手中的所有内容。加密前后。大小和字节。

标签: php encryption corruption corrupt data-integrity


【解决方案1】:

我认为数据已损坏,但我不确定是否是这种情况。

几乎可以肯定。可能出错的主要原因是记录太大而无法放入该字段并且 MAC 被截断。

如何调试/调查损坏的加密数据?

复制密文/密钥,将其置于受限环境中。

安装 defuse/php-encryption。将vendor/defuse/php-encryption/src/Crypto.php 编辑为disable the integrity checks inside of decryptInternal(),然后将明文转储到文件中。

这将使您恢复不良记录。注意:不保证这是您的用户提供的没有完整性标签的记录。

现在,请确保您的列对于预期的密文足够大,然后重新加密并覆盖它。

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多