【发布时间】:2018-08-16 16:57:55
【问题描述】:
在(不太遥远的)过去,(由在此工作较长时间的人)做出了一个决定,即在需要外部通信时始终将数据库 ID 动态“加密”到其他东西。
现在,我们的主应用程序已从 PHP 5.x 迁移到 PHP 7.0,分散在基础设施中的微服务运行 7.0 或 7.1。 7.1 服务器不断对 mcrypt 内容发出弃用警告。没什么大不了的,只是现在。但是随着 PHP 7.2 的临近,我们希望不断更新和升级。 Mcrypt 正在阻塞。
将所有当前加密的值保存在 60 个表中,跨越 1400 个数据库,是一项艰巨的任务。有没有办法利用 OpenSSL、Blowfish 和 ECB 来获得相同的编码和解码值,让我们陷入一种虚假的安全感?所有这些都是为了让我们可以提前计划我们的数据库迁移。
基本上,当前加密的值是这样的:
item:13fb7533bf19399ff114468b194ebfaf
这是 ID 123。它通过以下函数来获取该字符串:
$id = 123;
$type = 'item';
$serialized = serialize('' . $id); // To make sure always a string gets put in
$ivSize = mcrypt_create_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND);
$iv = mcrypt_create_iv($ivSize);
$passCrypt = mcrypt_encrypt(MCRYPT_BLOWFISH, $type, $serialized, MCRYPT_MODE_ECB, $iv);
$encoded = bin2hex($passCrypt); // `13fb7533bf19399ff114468b194ebfaf`
$encryptedId = $type . ':' . $encoded;
这给出了最终结果item:13fb7533bf19399ff114468b194ebfaf。
现在,反过来:
$encryptedId = 'item:13fb7533bf19399ff114468b194ebfaf';
$type = 'item';
$encryptedIdOnly = substr($encryptedId, strlen($type) + 1); // `13fb...`
$decoded = hex2bin($encryptedIdOnly);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_BLOWFISH, 'item', $decoded, MCRYPT_MODE_ECB, $iv); // This gives ' `s:3:"123";` '
$unserialized = unserialize($decrypted); // '123'
我已经尝试了几个小时,但我完全被任何加密货币所迷惑(但我想学习!)。我当前的代码是:
$cipher = 'BF-ECB';
//$cipher = 'BF'; (I've tried both, no difference)
$isCtypeXDigit = ctype_xdigit($decipher);
$decoded = hex2bin($decipher);
$ivLength = openssl_cipher_iv_length($cipher);
$randomBytes = openssl_random_pseudo_bytes($ivLength);
$decrypted = openssl_decrypt($decoded, $cipher, $prefix, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $randomBytes);
$unserialized = unserialize($decrypted);
这给了我一千个东西,都类似于��IY_Lc�d:�_���。任何人都可以对此有所启发 - 甚至可能吗?
【问题讨论】:
标签: php openssl mcrypt blowfish