我有一个代码库,可以在数据库中存储一些敏感数据。在将数据存储到数据库中之前,我先使用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
捕获上。我已经用一些示例代码手动进行了尝试,但是我总是得到InvalidCiphertextException
。
我认为数据已损坏,但是我不确定是否是这种情况。
该记录位于表的中间,其中有15000条记录都很好,并且该段代码的使用期限没有突然变化。
我还能做更多调查(甚至解密)的事情吗?还是我可以找到有关此记录的更多信息,或者进一步调试该记录的方法?
欢迎所有提示!
答案 0 :(得分:0)
我认为数据已损坏,但是我不确定是否是这种情况。
几乎可以肯定。可能出错的主要是,如果记录太大而无法放入该字段,并且MAC被截断了。
如何调试/调查损坏的加密数据?
获取密文/密钥的副本,并将其放置在受限的环境中。
安装defuse / php-encryption。将vendor/defuse/php-encryption/src/Crypto.php
修改为disable the integrity checks inside of decryptInternal()
,然后将纯文本转储到文件中。
这将使您恢复不良记录。注意:不能保证这是您的用户提供的没有完整性标记的记录。
现在,请确保您的列足够大以容纳所需的密文,然后重新加密并覆盖到位。