Ах! - Да, работает как шарм! Я открыл щедрость и могу предоставить ее за 23 часа. Я установил напоминание для себя, чтобы сделать это :-)!
шлом (не слишком отдаленно) было принято решение (кто-то, кто здесь больше работает) всегда «шифровать» идентификаторы базы данных к чему-то другому, на лету, всякий раз, когда это было необходимо для внешней связи.
Теперь мы перешли с 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:�_���
, Может ли кто-нибудь пролить свет на это - возможно ли это?