Security 安全HIPAA ePHI加密

Security 安全HIPAA ePHI加密,security,hipaa,Security,Hipaa,我有一些休息时间,我想选择一个新的项目来娱乐。我是一名大学生,每年我们都有一场在线投球比赛。我想为这场比赛创建一个项目,从现在起大约9个月。问题是该项目需要非常高的安全性,而且竞争非常激烈 我需要能够做到的事情: 1.存储HIPAA或ePHI(.pdf |.gif |.jpg |.doc) 2.强访问控制 3.支持大量用户和文件(100多万) 4.完整的审计报告(哦,ePhi,你真让人痛苦) 5.加密 建议的解决方案 0)将web应用放在防火墙后面的安全专用服务器上 1) 将文件存储在一个文件中

我有一些休息时间,我想选择一个新的项目来娱乐。我是一名大学生,每年我们都有一场在线投球比赛。我想为这场比赛创建一个项目,从现在起大约9个月。问题是该项目需要非常高的安全性,而且竞争非常激烈

我需要能够做到的事情: 1.存储HIPAA或ePHI(.pdf |.gif |.jpg |.doc) 2.强访问控制 3.支持大量用户和文件(100多万) 4.完整的审计报告(哦,ePhi,你真让人痛苦) 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);
}
?>
------
-SQL
------
------
-创建文件表
-----
创建表“文件”(
id INT非空自动增量,
文件名VARCHAR(50)不为空,
主键('id')
);
------
-创建文件表
-----
创建表“特权”(
uesr_id INT不为空,
文件id INT不为空,
);
------
-创建用户表
-----
创建表“用户”(
id INT非空自动增量,
名称VARCHAR(20)不为空,
电子邮件VARCHAR(50)不为空,
密码字符(40)不为空,
主键('id')
);
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) 在多个web服务器之间循环运行。我从来没有这样做过,所以我不知道怎么做。我不知道如何处理多个数据库服务器。有什么想法/建议吗

4) 使用Oracle企业标准数据库审核。我希望我可以使用MySQL,但是我找不到任何审计支持。我可以使用MySQL和PITA。有人在MySQL中使用过时间点架构(PITA)吗?你能分享你的经验吗

5) 显然,我可以用单向盐渍散列来散列密码。但是我需要加密所有的东西吗?此外,我根本看不到AES_加密(str,key_str)如何提高安全性。我想这可能会阻止管理员查看数据库?我可以/应该加密“secure_files/”文件夹中的所有内容吗?我可以像BitLocker那样使用全磁盘加密吗

基本上,我可以用php和CI实现在线银行级别的安全性吗?除了那些毫无价值的“你的白痴因为一无所知而付钱给专家”的建议之外,你还能提出其他建议吗

感谢您花时间通读这篇文章


采用自Redux Auth

关于单向散列。我说加密的错误。我通常会做一些类似的事情:

salt_长度='9'; } 公用函数哈希($password=false) { $salt\u length=$this->salt\u length; 如果($password==false) { 返回false; } $salt=$this->salt(); $password=$salt.substr(散列('sha256',$salt.$password),0,-$salt\u长度); 返回$password; } 专用功能盐() { 返回substr(md5(uniqid(rand(),true)),0,$this->salt_length); } } 编辑: 在sql数据库中加密敏感数据可抵御3种主要威胁

  • 内部威胁:

    系统管理员和开发人员

  • SQL注入:

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

  • 更安全的备份:

    分层安全

  • 所以很明显我可以加密 带有单向盐哈希的密码

    加密与散列不同。加密意味着有一种解密数据的方法。对密码使用加密功能是一种可被识别的漏洞。密码必须始终使用盐散列,sha-256是一个很好的算法。salt应该是a,因为它是一个非常随机的值,每个散列只使用1

    MySQL的
    AES\u ENCRYPT()
    很烂,它的使用非常糟糕。如果函数调用没有IV,则可能是ECB模式,如果IV为null,则违反CWE-329

    纯文本:

    使用ECB模式加密:

    加密很困难,您必须担心初始化向量、操作模式、密钥存储和string2key函数。绝大多数程序员认为加密很容易,但他们管理起来很认真。找一份实用的密码学,它直截了当,不需要数学计算。如果你喜欢数学,那就跟着学吧

    编辑: 我不太喜欢你的nonce生成,因为它的熵/大小比不好。当你可以用碱度为256的盐时,碱度为16的盐是一种浪费。请记住,大多数(可能所有)消息摘要实现都是二进制安全的。另外,
    uniqid()
    在计算中使用了大量时间,如果只使用时间,则违反了CWE-337。另一方面。还请记住,您可能应该将其存储为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);
        }
    
    公共函数nonce($size=32){//256位==32字节。
    对于($x=0;$xI同意你同意我lol。我将不得不读你建议的书。你自己读过吗?我是一名工科学生,所以数学很难让我害怕。它是否回答了任何关于密钥存储、初始化向量等的问题。大多数书都说;“嘿,这东西很难。你需要考虑这些事情。”但不要提出任何有用的解决方案。谢谢你的关注up@user379592你有很多C