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

时间:2018-10-17 12:14:50

标签: php encryption corruption corrupt data-integrity

我有一个代码库,可以在数据库中存储一些敏感数据。在将数据存储到数据库中之前,我先使用this Crypto librarydocs 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捕获上。我已经用一些示例代码手动进行了尝试,但是我总是得到InvalidCiphertextException

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

该记录位于表的中间,其中有15000条记录都很好,并且该段代码的使用期限没有突然变化。

我还能做更多调查(甚至解密)的事情吗?还是我可以找到有关此记录的更多信息,或者进一步调试该记录的方法?

欢迎所有提示!

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

获取密文/密钥的副本,并将其放置在受限的环境中。

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

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

现在,请确保您的列足够大以容纳所需的密文,然后重新加密并覆盖到位。