安全HIPAA ePHI加密

时间:2010-06-30 01:16:55

标签: security hipaa

我有一些停工时间,我想要选择一个有趣的新项目。我是一名大学生,每年都有在线竞赛。我想为这场比赛创建一个大约9个月的项目。问题是项目需要非常高的安全性,竞争非常激烈。

我需要做的事情:   1.存储HIPAA或ePHI(.pdf | .gif | .jpg | .doc)   2.强大的访问控制   3.支持大量用户和文件(100万+)   4.完整的审计报告(哦,你真是太痛苦了)   5.加密

建议的解决方案
0)将Web应用程序放在防火墙后面的安全专用服务器上

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 Database审核。我希望我可以使用MySQL,但我找不到任何审计支持。我可以使用MySQL并使用PITA。有没有人使用MySQL的时间点架构(PITA)?你可以分享一下你的经历吗?

5)显然,我可以使用单向盐水哈希来散列密码。但我需要加密一切吗?另外,我不知道AES_ENCRYPT(str,key_str)如何改善secuirty。我想这可能会阻止管理员查看数据库?可以/我应该加密“secure_files /”文件夹中的所有内容吗?我可以像BitLocker一样使用全盘加密吗?

基本上我可以通过php和CI实现在线银行级别的安全性吗?除了毫无价值的“你这个白痴去找专家因为你什么都不知道”之外,你能否提出任何其他建议?

感谢您抽出宝贵时间阅读本文。


从Redux Auth采用

关于单向哈希。我说加密的错误。我通常会做类似的事情:

salt_length ='9';         }         公共函数哈希($ password = false)     {         $ salt_length = $ this-&gt; salt_length;         if($ password === false)         {             返回false;         }         $ salt = $ this-&gt; salt();         $ password = $ salt。 substr(hash('sha256',$ salt。$ password),0, - $ salt_length);         return $ password;     }     私函盐()     {         return substr(md5(uniqid(rand(),true)),0,$ this-&gt; salt_length);     } } ?&GT;

1 个答案:

答案 0 :(得分:2)

修改 加密sql数据库中的敏感数据可防御3种主要威胁。

  1. 内部威胁:

    系统管理员和开发人员。

  2. SQL注入:

    如果您的数据库配置正确,sql注入应该只为攻击者提供对应用程序数据库的访问权限,而不是其他任何内容。在mysql中,请确保撤销FILE特权,因为这可用于读取硬编码密钥或配置文件。

  3. 更安全的备份:

    图层安全。

  4.   

    显然我可以加密   带有单向盐渍哈希的密码。

    加密与散列不同。加密意味着有一种解密数据的方法。使用密码加密功能是CWE-257识别的漏洞。密码必须始终使用salted哈希,而sha-256是一个很好的算法。 salt应该是Cryptographic nonce,因为在一个非常随机的值中,每个哈希只使用1个。

    MySQL的AES_ENCRYPT()很糟糕,使用ECB mode这很糟糕。如果函数调用没有IV可能是ECB模式,如果IV为null则违反了CWE-329。

    纯文字:

    alt text

    使用ECB模式加密:

    alt text

    加密很困难,您必须担心初始化向量,操作模式,密钥存储和string2key函数。绝大多数程序员认为密码学很容易,但他们认真管理mess things up。获取实用密码学的副本,它直截了当而不是数学重。如果您喜欢数学,那么请使用"The Handbook"

    修改 我不太喜欢你的nonce一代,因为它的熵/大小比例很差。当你可以含有256盐时,碱16盐是一种废物。请记住,大多数(可能所有)消息摘要实现都是二进制安全的。此外uniqid()在计算中花费了大量时间,如果仅使用时间,则会违反CWE-337。现在另一方面mt_rand() kicks ass。另外请记住,您应该将其存储为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);
        }