Безопасность PHP openssl_encrypt

#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 парольную фразу, более распространена, когда речь идет о чем-то, что может быть общим в сценарии шифрования/дешифрования.