Как выполнить репликацию:
// KEY_1 is the old key and KEY_2 is the new key
define('KEY_1', 'v3pQz7gtWaGF8N62EFK3VUv0m233ATde3c77z6oC5dk='); // openssl rand -base64 32
define('KEY_2', 'YDqviTmcH1iQJ1KdZXnOD8JILeqOV18t4T2t029Zp3s=');
$testString = '1996'; // or '1252', '1963'
$iv = 'kMg6JRRCq/jPcIQWzE+44Q==';
$encryptedValueUsingKey1 = openssl_encrypt($testString, 'aes128', KEY_1, OPENSSL_RAW_DATA, base64_decode($iv));
// try decrypting using new key
$decryptedValue = openssl_decrypt($encryptedValueUsingKey1, 'aes128', KEY_2, OPENSSL_RAW_DATA, base64_decode($iv)); // expected to be false, but has a value
// fallback to KEY_1 - but never run because $decryptedValue has value: ��e�hf2e��8�@�&
if (!$decryptedValue) {
$decryptedValue = openssl_decrypt($encryptedValueUsingKey1, 'aes128', KEY_1, OPENSSL_RAW_DATA, base64_decode($iv));
}
print_r($decryptedValue); // expected '1996'
Почему openssl_decrypt() не всегда возвращает false при использовании неправильного ключа шифрования? Я хочу иметь возможность менять ключи шифрования, чтобы оба ключа были активны в течение короткого времени, но не могу этого сделать, если не могу гарантировать, что openssl_decrypt() вернет false. Как я могу оставить обе клавиши активными на какое-то время, пока я выполняю вращение?
Другие примечания:
- Я просто для этого примера создан пример диапазона чисел от 1 до 9999. В большинстве случаев я получал ожидаемое ложное сообщение от openssl_decrypt(). Это всего лишь один пример того, когда мой запасной вариант не работает.
- Вектор инициализации является постоянным для всех зашифрованных значений в этой системе. Он был сгенерирован с использованием этого кода:
$ivLen = openssl_cipher_iv_length('aes128');
$ivEnc = openssl_random_pseudo_bytes($ivLen);
$iv = base64_encode($iv);
Подробнее здесь: https://stackoverflow.com/questions/792 ... d-of-false
Мобильная версия