Ключ шифрования PHP AES - PullRequest
0 голосов
/ 17 мая 2018

У меня есть система PHP и MySQL, и мне нужно зашифровать данные пользователя с помощью AES-256 .Я знаю, как шифровать и дешифровать данные, используя AES-encrypt / decrypt , но я не уверен, как безопасно хранить Ключ шифрования AES .Было бы рекомендовано сохранить ключ внутри файла вне папки общедоступного веб-сайта, затем использовать

<?php include('')?>

для вызова клавиши за шифрование ?

Спасибо

Ответы [ 3 ]

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

Доступ к вашим данным в настоящее время должен быть ограничен именем пользователя / паролем для MySQL. Где вы храните это?

Добавление шифрования в микшер повышает возможность разделения данных, которые вам нужны для доступа к данным, на разные подложки - с разной экспозицией.

Ссылка в комментарии Мехди охватывает некоторые варианты на довольно абстрактном уровне.Это не касается, например, хранения ключа у клиента.Но выбор используемых вами методов зависит от инфраструктуры, управления кодом, развертывания и рабочих процессов.Правильный выбор для низкоуровневого общего веб-хостинга не является правильным выбором для выделенного центра обработки данных и наоборот.

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

OTOH это не лучшее решение, если ключ находится в вашем хранилище github или если другие люди имеют доступ к вашей файловой системе / резервным копиям / журналам.

Вам нужно подумать о том, как вы разрабатываете код, кто должен иметь возможность использовать ключ, кто должен видеть сам ключ, кто точно не должен видеть ключ, как ваши резервные копииуправляются тем, у кого есть доступ к вашему хранилищу .....

Невозможно предоставить достаточную информацию в вопросе здесь о SO, чтобы получить информированный и окончательный ответ.

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

Внизу вышеупомянутого ответа я добавил:

    /* 
    $key will store in the database in refrence of this content and this key will use to decrypt the data as given below
    $
*/
$content = 'blahlol';
$aes = new AES_Encrypt();
$encryptedData = $aes->setData($content)->encrypt()->getEncryptedString();
$key = $aes->getKey();
echo $encryptedData;
echo '<br>';
$decryptedData = $aes->setData($encryptedData)->decrypt()->getDecryptedString();
echo $decryptedData;
//The code above outputs an encrypted string followed by "blahlol" which is my     $content variable.

//Below, I'm trying to grab the encrypted string from the database and decrypt it. However it outputs nothing
echo '<br><br><br><br>Database:<br><br>';
$sql = "SELECT * from data WHERE id = '1'";
$result = $con->query($sql);
while($rowLol = $result->fetch_assoc()) {
        echo $rowLol['data']; //Outputs encrypted string
        $aes = new AES_Encrypt($key);
$decryptedData = $aes->setData($rowLol['data'])->decrypt()->getDecryptedString();
echo $decryptedData; //Meant to output decrypted string (blahlol)
}
?>

Вверху он выводит зашифрованную строку «blahlol», за которой следует расшифрованный текст «blahlol» после расшифровки.Однако я пытаюсь расшифровать его, получив зашифрованную строку для базы данных.Как отмечено в коде, дешифрованная часть ничего не выводит.

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

Существует два способа хранения зашифрованных данных.

  1. Файл
  2. Databse

Если данных меньше, вы можете управлять зашифрованными данными в базе данных, а если данные большие, то хорошо хранить зашифрованныеданные в файле за пределами общей папки.Чтобы сделать данные более безопасными, используйте уникальный ключ для шифрования всех данных и сохраните этот уникальный ключ в базе данных, включая эталонное значение данных, чтобы при расшифровке данных использовать указанный уникальный ключ из базы данных.

Создать класс php длясправиться с этим.

<?php
class AES_Encrypt {
    /**
     * @var string 
     */
    private $key;

    /**
     * 
     * @var String 
     */
    private $string;

    /**
     *
     * @var String
     */
    private $encryptedString;

    /**
     *
     * @var String
     */
    private $decryptedString;

    /**
     * Constructor
     */
    public function __construct($key = null) {
        if (empty($key)) {
            $this->setKey(md5($this->randomStr(5)) . '.' . base64_encode(openssl_random_pseudo_bytes(32)));
        } else {
            $this->setKey($key);
        }
    }

    /**
     * 
     * @param String $key
     * @return \AES_Encrypt
     */
    public function setKey($key) {
        $this->key = $key;

        return $this;
    }

    /**
     * Return security key
     * @return string
     */
    public function getKey() {

        return $this->key;
    }

    /**
     * 
     * @param type $string
     * @return \AES_Encrypt
     */
    public function setData($string) {
        $this->string = $string;

        return $this;
    }

    /**
     * 
     * @return string
     */
    public function getData() {

        return $this->string;
    }

    /**
     * Convert encrypt string from plain
     * @return \AES_Encrypt
     */
    public function encrypt() {
        $privateKey = explode('.', $this->getKey(), 2);
        // Remove the base64 encoding from our key
        $encryption_key = base64_decode($privateKey[1]);
        // Generate an initialization vector
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
        // Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
        $encrypted = openssl_encrypt($this->getData(), 'aes-256-cbc', $encryption_key, 0, $iv);
        // The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
        $this->encryptedString = base64_encode($encrypted . '::' . $iv);

        return $this;
    }

    /**
     * 
     * @return string
     */
    public function getEncryptedString() {

        return $this->encryptedString;
    }

    /**
     * 
     * @return string
     */
    public function getDecryptedString() {

        return $this->decryptedString;
    }

    /**
     * Convert decrypt string
     */
    public function decrypt() {
        $privateKey = explode('.', $this->getKey(), 2);
        // Remove the base64 encoding from our key
        $encryption_key = base64_decode($privateKey[1]);
        // To decrypt, split the encrypted data from our IV - our unique separator used was "::"
        list($encrypted_data, $iv) = explode('::', base64_decode($this->getData()), 2);
        $this->decryptedString = openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);

        return $this;
    }

    /**
     * 
     * @param type $length
     * @return string
     */
    public function randomStr($length = 5) {
        $string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $charactersLength = strlen($string);
        $str = '';
        for ($i = 0; $i < $length; $i++) {
            $str .= $string[rand(0, $charactersLength - 1)];
        }
        return $str;
    }

}

$aes = new AES_Encrypt();
$encryptedData = $aes->setData($content)->encrypt()->getEncryptedString();
$key = $aes->getKey();

/* 
    $key will store in the databse in refrence of this content and this key will use to decrypt the data as given below

*/
$aes = new AES_Encrypt($key);
$decryptedData = $aes->setData($encryptedContent)->decrypt()->getDecryptedString();
...