Безопасность HIPAA ePHI Шифрование - PullRequest
4 голосов
/ 30 июня 2010

У меня немного простоя, и я думаю выбрать новый проект для развлечения.Я студент колледжа, и каждый год мы проводим онлайн-конкурс.Я хочу создать проект для этого конкурса, который будет через 9 месяцев.Проблема в том, что проект требует очень высокой безопасности, а конкуренция очень конкурентная.

Что мне нужно сделать: 1. Хранить HIPAA или ePHI (.pdf | .gif | .jpg | .doc) 2. Надежный контроль доступа 3. Поддержка большого количества пользователей и файлов (1миллионов +) 4. Полные аудиторские отчеты (о, черт возьми, ты такая боль) 5. Шифрование

Предлагаемые решения
0) Разместите веб-приложение на защищенном выделенном сервере за брандмауэром

1) Сохраните файлы в файле с именем «secure_files /», а затем используйте mod_rewrite, чтобы ограничить доступ к этому каталогу.

Что-то в строках:

#Removes access to the secure_files folder by users.
RewriteCond %{REQUEST_URI} ^secure_files.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

Затем используйте php-скрипт, чтобы открыть файлы, если у пользователя есть для этого полномочия.Так что я могу просто использовать:

------
-SQL
------

------
- create files table
-----
CREATE TABLE `files` (
id INT NOT NULL AUTO_INCREMENT,
file_name VARCHAR(50) NOT NULL,
PRIMARY KEY('id')
);

------
- create files table
-----
CREATE TABLE `privileges` (
uesr_id INT NOT NULL,
file_id INT NOT NULL,
);

------
- create users table
-----
CREATE TABLE `users` (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
email VARCHAR(50) NOT NULL,
password CHAR(40) NOT NULL,
PRIMARY KEY('id')
);

<?php
public function get_user_files($filename)
{
   //this is set during login
   $user_id = $this->session->userdata('user_id');

   //check to see if the user has privileges to access the file and gets the file name
   $query = $this->db->join('privileges','privileges.id = files.id')
                     ->select('files.file_name')
                     ->where('privileges.user_id',$user_id)
                     ->where('files.file_name',$file_name)
                     ->limit(1)
                     ->get('files');

    $file = $query->row()->files.file_name;

   if($file)
   {
    //user has privileges to access the file so include it
    $handle = fopen($file, "rb");
    $data['file'] = fread($handle, filesize($file));
    fclose($handle);
   }
  $this->load->view('files',$data);
}
?>

2) Использовать класс сеансов CI, чтобы добавить «пользователя» в сеанс.

Контроллер проверяет, установлен ли сеанс:

<?php
public function __construct()        
    {
        parent::__construct();

        if($this->secure(array('userType' => 'user')) == FALSE)
        {
            $this->session->set_flashdata('flashError', 'You must be logged into a valid user account to access this section.');
            $this->session->sess_destroy();
            redirect('login');
        }
    }    

function secure($options = array())
    {            
        $userType = $this->session->userdata('userType');

        if(is_array($options['userType']))
        {
            foreach($options['userType'] as $optionUserType)
            {
                if($optionUserType == $userType) return true;
            }
        }
        else
        {
            if($userType == $options['userType']) return true;
        }
        return false;
    }
?>

3) Поверните циклический перебор между несколькими веб-серверами.Я никогда не делал этого, поэтому понятия не имею, как это сделать.Я понятия не имею, как бороться с несколькими серверами баз данных.Любые идеи / предложения?

4) Использовать аудит базы данных Oracle Enterprise Standard.Я хотел бы использовать MySQL, но я не могу найти поддержку аудита.Я мог бы использовать MySQL и PITA.Кто-нибудь использовал точечную архитектуру (PITA) с MySQL?Можете ли вы поделиться своим опытом?

5) Так что, очевидно, я могу хэшировать пароли с односторонним хэшированием.Но нужно ли мне все шифровать?Также я не вижу, как AES_ENCRYPT (str, key_str) вообще улучшает secuirty.Я думаю, это может помешать администратору смотреть на базу данных?Могу ли я / должен зашифровать все в папке «secure_files /»?Могу ли я просто использовать полное шифрование диска, например BitLocker?

В принципе, могу ли я достичь уровня безопасности онлайн-банка с помощью php и CI?Можете ли вы сделать какие-либо другие предложения, кроме бесполезных предложений «ваш идиот, платите эксперту, потому что вы ничего не знаете»?

Спасибо, что нашли время, чтобы прочитать это.


взято из Redux Auth

Относительно одностороннего хеширования.Моя ошибка в том, что я сказал шифрование.Я обычно делаю что-то похожее на:

salt_length = '9';} открытый хэш функции ($ password = false) {$ salt_length = $ this-> salt_length;if ($ password === false) {return false;} $ salt = $ this-> salt ();$ пароль = $ соль.substr (хеш ('sha256', $ salt. $ password), 0, - $ salt_length);вернуть $ пароль;} приватная функция salt () {return substr (md5 (uniqid (rand (), true)), 0, $ this-> salt_length);}}?>

1 Ответ

2 голосов
/ 30 июня 2010

Редактировать: Шифрование конфиденциальных данных в базе данных SQL защищает от 3 основных угроз.

  1. Внутренние угрозы:

    Системный администратор и разработчики.

  2. SQL-инъекция:

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

  3. Еще более безопасные резервные копии:

    Безопасностьв слоях.

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

Шифрование - это не то же самое, что хеширование.Шифрование подразумевает, что существует способ расшифровки данных.Использование функции шифрования для паролей является уязвимостью, признанной CWE-257 .Пароли должны всегда использовать соленый хеш, а sha-256 - отличный алгоритм.Соль должна быть Cryptographic nonce , как в очень случайном значении, которое используется только 1 на хеш.

MySQL AES_ENCRYPT() отстой, его использование ECB mode , что ужасно.Если вызов функции не имеет IV, то, вероятно, это режим ECB, если IV равен нулю, это нарушение CWE-329.

Простой текст:

alt text

зашифровано в режиме ECB:

alt text

Шифрование затруднено, вам нужно беспокоиться о векторах инициализации, режимах работы, хранении ключей и функциях string2key.Подавляющее большинство программистов думают, что криптография проста, но они серьезно запутывают .Получить копию практической криптографии, прямо к делу и не тяжело математике.Если вы любите математику, тогда используйте «Справочник» .

РЕДАКТИРОВАТЬ: Мне не очень нравится ваше поколение nonce, потому что оно имеет плохую энтропию / размерсоотношение.Соль base16 - это пустая трата, когда у вас может быть соль 256 base.Имейте в виду, что большинство (вероятно, все) реализации дайджеста сообщений безопасны в двоичном формате.Также uniqid() использует много времени для своих расчетов, и если бы он использовал только время, это было бы нарушением CWE-337.Теперь с другой стороны mt_rand () пинает задницу .Также имейте в виду, что вы, вероятно, должны сохранить это как base64, а затем декодировать base64 перед использованием в вашей хэш-функции.

    public function nonce($size=32){//256 bit == 32byte. 
        for($x=0;$x<$size;$x++){
            $ret.=chr(mt_rand(0,255));
        }
        return base64_encode($ret);
    }
...