Зашифрованные данные не расшифровываются после метода $ _POST в PHP - PullRequest
0 голосов
/ 31 мая 2018

Я обнаружил, что всякий раз, когда я добавляю свое значение из значения selectbox для шифрования и отправки в виде метода $_POST и его дешифрования, оно становится равным NULL или вообще не имеет никакого значения,Вот код ниже.Я также использую код ajax здесь, но я не думаю, что это необходимо, потому что он передает значение.Как мне решить эту проблему?

option.php
    $species1 = 'Ant';
    $species2 = "Man";

    $obj = new EncDecrypt();
    $species1Enc = $obj->encrypt_data($species1);
    $species2Enc = $obj->encrypt_data($species2);

    echo '<select id="species" name="species">';'
    echo '<option value='.$species1Enc.'>Ant</option>';
    echo "<option value=\"".$species2Enc."\">Man</option>";
    echo '</select>';'

encdecrypt.php
    Class EncDecrypt
    {
        public function encrypt_data($data)
        {
            $plaintext = $data;

                $password = '3sc3RLrpd17';
                $method = 'aes-256-cbc';
                $key = password_hash($password, CRYPT_BLOWFISH, ['cost' => 12]);
                $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

                $encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));

                return $encrypted;
            }

            public function decrypt_data($data)
            {
                $data = $data;

                $password = '3sc3RLrpd17';
                $method = 'aes-256-cbc';
                $key = password_hash($password, CRYPT_BLOWFISH, ['cost' => 12]);
                $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

                $decrypted = openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA, $iv);       

                return $decrypted;
            }
    }

display.php 
  if(isset($_POST["species"]) && !empty($_POST['species']))  
  {  
    $decdata = new EncDecrypt();
    $decryptData = $decdata->decrypt_data($_POST['species']);

    echo "<h1>".$species."</h1>";
  } 

1 Ответ

0 голосов
/ 31 мая 2018

У вас есть несколько опечаток с ' трейлингом ; на echo '<select id="species" name="species">';' и echo '</select>';'

Тогда я не до конца понимаю, почему вы пытаетесь зашифровать данные формы и чтоименно здесь вы пытаетесь достичь.

В любом случае, к технической части вашего вопроса о том, почему не работает часть шифрования-дешифрования:

Прежде всего вы используете $key = password_hash($password, CRYPT_BLOWFISH, ['cost' => 12]);, чтосоздайте новую строку каждый раз.

Измените это на следующее $key = hash('sha256', $password, true);

Тогда $iv должно быть уникальным каждый раз, когда вы делаете новое шифрование, и должно быть каким-либо образом передано в вашей переменной POST.Хороший способ получить $ iv - это использовать openssl_random_pseudo_bytes()

Итак, чтобы достичь того, о чем я говорил, прежде чем менять свои функции:

public function encrypt_data($data) {
    $plaintext = $data;
    $password = '3sc3RLrpd17';
    $method = "AES-256-CBC";
    $key = hash('sha256', $password, true);
    $iv = openssl_random_pseudo_bytes(16);

    $ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);
    $hash = hash_hmac('sha256', $ciphertext, $key, true);

    return $iv . $hash . $ciphertext;
}

public function decrypt_data($data) {
    $ivHashCiphertext = $data;
    $password = '3sc3RLrpd17';
    $method = "AES-256-CBC";
    $iv = substr($ivHashCiphertext, 0, 16);
    $hash = substr($ivHashCiphertext, 16, 32);
    $ciphertext = substr($ivHashCiphertext, 48);
    $key = hash('sha256', $password, true);

    if (hash_hmac('sha256', $ciphertext, $key, true) !== $hash) return null;

    return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);
}

Наконец, вам нужно использовать base64_encode() и base64_decode() при вызове функций encrypt_data и decrypt_data()

$species1Enc = base64_encode($obj->encrypt_data($species1));

$species2Enc = base64_encode($obj->encrypt_data($species2));

$decryptData = $decdata->decrypt_data(base64_decode($_POST['species']));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...