安全 HIPAA ePHI 加密

标签 security hipaa

我有一些空闲时间,我正在考虑选择一个新项目来娱乐。我是一名大学生,每年我们都会举办在线推介比赛。我想为这个距现在大约 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);
}
?>

2) 使用 CI session 类将“用户”添加到 session 中。

Controller 检查是否设置了 session :
<?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。有没有人在 MySQL 中使用过时间点架构 (PITA)?你能分享你的经验吗?

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

基本上我可以用php和CI实现网上银行级别的安全吗?除了毫无值(value)的“你的白痴去付钱给专家,因为你一无所知”的建议之外,你还能提出任何其他建议吗?

感谢您花时间阅读本文。

从 Redux Auth 采用

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

salt_length = '9';
}

公共(public)函数哈希($password = false)
{
$salt_length = $this->salt_length;

if ($password === false)
{
返回假;
}

$salt = $this->salt();

$密码= $盐。 substr(hash('sha256',$salt . $password), 0, -$salt_length);
返回$密码;
}

私有(private)函数盐()
{
返回 substr(md5(uniqid(rand(), true)), 0, $this->salt_length);
}
}
?>

最佳答案

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

  • 内部威胁:

    系统管理员和开发人员。
  • SQL注入(inject):

    如果您的数据库配置正确,则 sql 注入(inject)应该只为攻击者提供对应用程序数据库的访问权限,而不是其他任何东西。在 mysql 中确保您撤销 FILE特权,因为这可用于读取硬编码的 key 或配置文件。
  • 更安全的备份:

    分层安全。

  • So obviously I can encrypt the passwords with a one way salted hash.



    加密与散列不同。加密意味着有一种解密数据的方法。对密码使用加密功能是 CWE-257 识别的漏洞.密码必须 总是 使用加盐哈希,sha-256 是一个很棒的算法。盐应该是 Cryptographic nonce ,就像在一个非常随机的值中一样,每个散列只使用 1 个。

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

    纯文本:

    alt text

    使用 ECB 模式加密:

    alt text

    加密很困难,您必须担心初始化向量、操作模式、 key 存储和 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);
        }
    

    关于安全 HIPAA ePHI 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145867/

    相关文章:

    database - 在 SQL 和 HIPAA 中存储 DICOM header

    ios - HIPAA 合规性是否应该不允许在移动原生应用程序中进行离线存储?

    security - tomcat 漏洞 : JSP Upload Bypass CVE-2017-12617 的有效利用

    asp.net-mvc - ASP.NET MVC 中的 AntiForgeryToken 是否可以防止所有 CSRF 攻击?

    image - flutter:FadeInImage.assetNetwork:如何添加访问 token 之类的请求 header

    flutter - 可以将 Flutter 用于符合 Hipaa 的应用程序吗?

    java - 在Android应用程序中不要硬编码的内容

    php - 是否有可能 "pirate" session 变量(我不想知道如何)

    google-cloud-platform - 谷歌云负载均衡器是否符合 hipaa 要求

    敏感数据的 MySQL 数据库安全性