В (не столь отдаленном) прошлом было принято решение (кем-то, кто здесь больше работает) всегда «шифровать» идентификаторы базы данных во что-то еще, на лету, всякий раз, когда это необходимо для внешней связи.
Теперь мы перешли с PHP 5.x на PHP 7.0 для нашего основного приложения, а наши микросервисы, разбросанные по нашей инфраструктуре, работают либо на 7.0, либо на 7.1. Серверы 7.1 продолжают выдавать предупреждения об устаревании для mcrypt. Ничего страшного, пока. Но поскольку PHP 7.2 не за горами, мы хотим продолжать обновлять его. Мкрипт блокирует.
Сохранение всех текущих зашифрованных значений в 60 таблицах в 1400 базах данных — огромная задача. Есть ли способ использовать OpenSSL с Blowfish и ECB, чтобы получить одни и те же закодированные и декодированные значения, чтобы убаюкать нас ложным чувством безопасности? Все это для того, чтобы мы могли заранее планировать миграцию нашей базы данных.
По сути, текущее зашифрованное значение таково:
item:13fb7533bf19399ff114468b194ebfaf
Это идентификатор 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:�_���
. Может ли кто-нибудь пролить свет на это - возможно ли это вообще?