【发布时间】: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