laravel 4.2 запросов с зашифрованным столбцом

В настоящее время у меня этот код в контроллере, который отображает набор записей, вот мой код

public function view() { $title = "View Guardian Information"; $vPa = DB::table('dbo_guardianinformation') ->join('dbo_cities', 'dbo_guardianinformation.CityID', '=' , 'dbo_cities.CityID') ->select('dbo_guardianinformation.ParentAccountID','dbo_guardianinformation.FirstName','dbo_guardianinformation.LastName','dbo_guardianinformation.Roles', 'dbo_guardianinformation.Address','dbo_cities.CityName','dbo_guardianinformation.Status','dbo_guardianinformation.EmailAddress') ->get(); //encrypt decrypt algo // $sptkey = md5('sample_encryptkey'); // $enPass = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sptkey, $defPass, MCRYPT_MODE_ECB))); // $decPass = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sptkey, base64_decode($enPass), MCRYPT_MODE_ECB)); return View::make('ssims.view_parentAccount',compact('title','vPa')); } 

моя проблема в том, что столбец dbo_guardianinformation.Address содержит зашифрованные записи, которые я в настоящее время не знаю, куда я должен поместить код дешифрования, чтобы при $vPa в представление он уже содержал дешифрованные записи. есть идеи? благодаря тому, кто поможет

Индексирование зашифрованных данных

Если вам нужно быстро и эффективно искать зашифрованный столбец в базе данных SQL , вам нужно построить слепой индекс данных (например, сохранить hash_hmac('sha256', $plaintext, $separate_key_here) в дополнительном столбце) и структурировать ваш выбор запросов на основе этого. (Связанная статья объясняет требования безопасности.)

Это избавит вас от необходимости делать цикл foreach() но, поскольку HMAC-SHA256 используется, невероятно маловероятно, что злоумышленник с доступом к базе данных сможет дразнить открытый текст из системы.


Тем не менее, есть еще кое-что, о чем я хотел бы обратиться:

Слабая криптография

Пожалуйста, не используйте код шифрования, который вы включили в свой вопрос. Это очень неуверенно. Laravel имеет собственный класс шифрования ; используйте это вместо этого. Он многое делает правильно, что фрагмент кода, который вы включили, не работает. Например: он обеспечивает аутентифицированное шифрование .

 $sptkey = md5('sample_encryptkey'); 

Если вы хотите получить степень безопасности в своем приложении, никогда не используйте md5($string) для генерации ключа. Это всего лишь плохая идея:

  • md5() возвращает шестнадцатеричную строку с 32 символами
  • Большинство функций шифрования ожидают необработанную двоичную строку
  • MD5 – невероятно сломанная хеш-функция
  • Чтобы преобразовать пароль в ключ шифрования, вам нужно использовать функцию деривации ключа, то есть P assword- B ased K ey D erivation F unction # 2 с SHA-256 (PBKDF2-SHA256).

Рассмотрим, например, этот код:

 define('MY_APP_PBKDF2_ITERATIONS', 86000); define('MY_APP_KEY_LENGTH', 32); // or 16 for AES-128 // ... $sptkey = hash_pbkdf2( 'sha256', $your_password, $salt, // 32 bytes from /dev/urandom MY_APP_PBKDF2_ITERATIONS, MY_APP_KEY_LENGTH, true ); 

Я расширил пробелы здесь и оставил некоторые встроенные комментарии ниже:

 $enPass = rtrim( // Unnecessary, base64_encode doesn't leave whitespace base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, // This isn't AES-256 by the way $sptkey, $defPass, MCRYPT_MODE_ECB // ECB mode is the worst mode ) ) ); $decPass = rtrim( // Padding oracle attack mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $sptkey, base64_decode($enPass), // No error checking MCRYPT_MODE_ECB ) ); 

Дальнейшее чтение по конкретным вопросам:

  • MCRYPT_RIJNDAEL_256
  • MCRYPT_MODE_ECB
  • Заполнение Oracle Attack

Что делать (выберите один):

  • Используйте функции шифрования Laravel , поскольку вы уже используете Laravel.
  • Используйте libsodium (рекомендуется)
  • Использовать класс шифрования PHP Defuse Security
  • Когда Halite достигает 1.0.0, переключитесь на это (это в основном libsodium для новичков)

оказывается, я немного потрудился и помог от Жоао Мендеса, у меня был код вроде этого

 public function view() { $title = "View Guardian Information"; $vPa = DB::table('dbo_guardianinformation') ->join('dbo_cities', 'dbo_guardianinformation.CityID', '=' , 'dbo_cities.CityID') ->select('dbo_guardianinformation.ParentAccountID','dbo_guardianinformation.FirstName','dbo_guardianinformation.LastName','dbo_guardianinformation.Roles', 'dbo_guardianinformation.Address','dbo_cities.CityName','dbo_guardianinformation.Status','dbo_guardianinformation.EmailAddress') ->get(); foreach ($vPa as $key => $dvPa) { $sptkey = md5('this is secret'); $enAdd = $dvPa->Address; $decAdd = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sptkey, base64_decode($enAdd), MCRYPT_MODE_ECB)); $dvPa->Address = $decAdd; } return View::make('ssims.view_parentAccount',compact('title','vPa')); }