2010-06-30 3 views
4

J'ai quelques temps morts et je pense à choisir un nouveau projet pour le plaisir. Je suis un étudiant et chaque année nous avons un concours de pitch en ligne. Je veux créer un projet pour ce concours de pitch qui aura lieu dans environ 9 mois. Le problème est que le projet nécessite une très haute sécurité et que la concurrence est très compétitive.Sécurité HIPAA ePHI Encryption

choses que je dois être en mesure de le faire: 1. magasin HIPAA ou ePHI (.pdf | .gif | .jpg | .doc) 2. Contrôle d'accès fort 3. Soutenir le grand nombre d'utilisateurs et les fichiers (1 million +) 4. Rapports d'audit complet (oh Ephi vous êtes une telle douleur) 5. le cryptage

Solutions proposées
0) Placez l'application Web sur un sever dédié sécurisé derrière un pare-feu

1 Stocker les fichiers dans un fichier nommé "secure_files /", puis utiliser mod_rewrite pour restreindre l'accès à ce l'irectory.

Quelque chose sur les lignes de:

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

Ensuite, utilisez un script php pour ouvrir les fichiers si l'utilisateur dispose des droits pour le faire. Alors Pourrais-je simplement utiliser:

------ 
-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) Utiliser la classe sessions CI pour ajouter un "utilisateur" à la session.

Le contrôleur vérifie pour voir si la session est défini:

<?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) Faire tourner la ronde entre plusieurs Severs Web. Je n'ai jamais fait ça alors je n'ai aucune idée de comment faire ça. Je n'ai aucune idée de la façon de traiter les multiples serveurs de bases de données. Des idées/suggestions?

4) Utilisez l'audit de base de données Oracle Enterprise Standard. J'aimerais pouvoir utiliser MySQL, mais je ne trouve aucun support d'audit. Je pourrais utiliser MySQL et utiliser PITA. Quelqu'un at-il utilisé l'architecture PITA (point-in-time) avec MySQL? peux-tu partager ton expérience?

5) Donc, évidemment, je peux hacher les mots de passe avec un hash salé à sens unique. Mais dois-je tout crypter? Aussi, je ne vois pas comment AES_ENCRYPT (str, key_str) améliore la sécurité du tout. Je suppose que cela pourrait empêcher un administrateur de regarder une base de données? Est-ce que je peux/dois-je tout chiffrer dans le dossier "secure_files /"? Pourrais-je simplement utiliser le cryptage de disque complet comme BitLocker?

Fondamentalement, puis-je obtenir une sécurité bancaire en ligne avec php et CI? Pouvez-vous faire d'autres suggestions en plus de l'inutile "votre idiot va payer un expert parce que vous ne savez rien" des suggestions?

Merci d'avoir pris le temps de lire ceci.


adopté de Redux Auth

En ce qui concerne hachage à sens unique. Mon erreur pour dire cryptage.Je fais habituellement le faire quelque chose de semblable à:

salt_length = '9'; } hachage de fonction publique ($ password = false) { $ salt_length = $ this-> salt_length; if ($ password === false) { return false; } $ salt = $ this-> salt(); $ password = $ salt. substr (hash ('sha256', $ salt. $ mot de passe), 0, - $ salt_length); return $ mot de passe; } private function salt() { return substr (md5 (uniqid (rand(), true)), 0, $ this-> salt_length); }} >
+0

À l'avenir, vous devriez essayer de diviser de grandes questions comme celle-ci en plus petits morceaux. Il sera plus facile de répondre et vous obtiendrez plus de points :) – rook

Répondre

2

Edit:? Encrypting données sensibles dans une base de données SQL défend contre 3 principales menaces.

  1. Menaces internes:

    système admin et les développeurs.

  2. Injection SQL:

    Si votre base de données est correctement configuré sql injection ne doit fournir à l'attaquant d'accéder à la base de données de l'application, et rien d'autre. Dans mysql, assurez-vous que vous révélez FILE privilégié car cela pourrait être utilisé pour lire une clé codée en dur ou un fichier de configuration.

  3. encore plus sécurisé sauvegardes:

    sécurité en couches.

Alors, évidemment, je peux chiffrer les mots de passe avec une façon hachage salée.

Le cryptage n'est pas identique au hachage. Le cryptage implique qu'il existe un moyen de décrypter les données. L'utilisation d'une fonction de chiffrement pour les mots de passe est une vulnérabilité reconnue par CWE-257. Les mots de passe doivent toujours utiliser un hachage salé, et sha-256 est un excellent algorithme. Le sel doit être un Cryptographic nonce, comme dans une valeur très aléatoire qui n'est utilisée que 1 par hachage.

MySQL AES_ENCRYPT() suce, son utilisation ECB mode ce qui est terrible. Si l'appel de la fonction n'a pas de IV c'est probablement le mode ECB, si l'IV est nul, alors c'est une violation de CWE-329.

Texte brut:

alt text

cryptée avec le mode de la BCE:

alt text

Le chiffrement est difficile, vous avez à vous soucier de vecteurs d'initialisation, les modes d'exploitation, le stockage des clés et fonctions de string2key.La grande majorité des programmeurs pense que la cryptographie est facile, mais ils gèrent sérieusement mess things up. Obtenez une copie de Practical Cryptography, son droit au but et pas lourd en mathématiques. Si vous aimez les maths, rendez-vous au "The Handbook". Je n'aime pas beaucoup votre génération nonce car elle a un mauvais rapport entropie/taille. Un sel base16 est un gaspillage lorsque vous pouvez avoir un sel de base 256. Gardez à l'esprit que la plupart des implémentations de résumé de message (probablement toutes) sont binaires sans danger. Aussi uniqid() utilise beaucoup de temps dans son calcul, et si elle utilisait seulement le temps, ce serait une violation de CWE-337. Maintenant, d'autre part mt_rand() kicks ass. Gardez également à l'esprit que vous devriez probablement stocker cela sous forme de base64, puis base64 le décoder avant de l'utiliser dans votre fonction de hachage.

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

Je suis d'accord avec vous d'accord avec moi lol. Je vais devoir lire le livre que vous avez suggéré. L'avez-vous lu? Je suis un étudiant en ingénierie donc les mathématiques ne font pas grand chose pour me faire peur. Répond-il aux questions sur le stockage des clés, les vecteurs d'initialisation, etc. "Hé, c'est dur, tu dois penser à ces choses." Pourtant, ne présentez pas de solutions utiles. Merci pour votre suivi – John

+0

@ user379592 Vous avez de nombreuses violations CWE dans ce post. Les cueillir et les documenter est ce que je peux faire de mieux. Si vous avez une question plus spécifique, vous obtiendrez une meilleure réponse. Si les mathématiques ne vous font pas peur, rendez-vous sur "The Handbook" (http://books.google.com/books?id=nSzoG72E93MC&dq=handbook+of+applied+cryptography&printsec=frontcover&source=bn&hl=fr&ei=lr4qTISWEYKjnQeL0vR5&sa=X&oi=book_result&ct = résultat & resnum = 6 & ved = 0CDwQ6AEwBQ # v = onepage & q & f = false) – rook

+0

Je suis complètement d'accord avec votre nonce. C'est une bien meilleure amélioration. Merci encore de ne pas m'avoir rejeté comme un noob sans espoir. J'ai beaucoup à apprendre, mais là encore j'ai une bibliothèque, pas de télévision et de bons conseils de gens formidables. Je vous remercie. Je vais regarder à travers "The Handbook" (dois aimer les titres de livres mystérieux) et CWE. – John

Questions connexes