#php #encryption
Вопрос:
Я смог зашифровать и расшифровать строки, используя следующие функции, которые были приведены в качестве примеров в документах PHP:
function encryptText($plaintext) {
$cipher = "AES-128-CBC";
$options = OPENSSL_RAW_DATA;
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
$ciphertext = base64_encode($iv . $hmac . $ciphertext_raw);
return $ciphertext;
}
function decryptText($ciphertext) {
$cipher = "AES-128-CBC";
$options = OPENSSL_RAW_DATA;
$sha2len = 32;
$cyphertext_dec = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($cyphertext_dec, 0, $ivlen);
$hmac = substr($cyphertext_dec, $ivlen, $sha2len);
$ciphertext_raw = substr($cyphertext_dec, $ivlen $sha2len);
$decrypted = openssl_decrypt($ciphertext_raw, $cipher, $key, $options, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
// timing attack safe comparison
if (hash_equals($hmac, $calcmac)) {
return $decrypted;
}
}
Однако зашифрованная строка, возвращаемая из encryptText, может быть просто расшифрована любым пользователем с помощью функции decryptText, что заставляет меня задуматься, в чем смысл шифрования?
Есть ли какие-то способы добавить эти функции, чтобы сделать их более безопасными?
Комментарии:
1. Я не понимаю вашего вопроса — почему бы не сохранить шифр в секрете, как обычно в вашем шифровании?
2. Кроме того, почему бы не использовать любую из существующих библиотек (например, phpseclib), чтобы избежать этих низкоуровневых вызовов?
3. Расшифрован кем-нибудь? Дешифрующая сторона должна знать ключ (
$key
).4. Ах, я не уловил переменную $key в примере. Поскольку я не устанавливал его в своих экспериментах, очевидно, использовалась пустая строка? Вы хотите сказать, что я могу установить $key на любую строку и просто обязательно использовать ее с обоих концов?
5. Да,
$key
это общая парольная фраза, имя аргумента для$key
которой является парольной фразой, странно, что документация, содержащая$key
парольную фразу, более распространена, когда речь идет о чем-то, что может быть общим в сценарии шифрования/дешифрования.