首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全HIPAA ePHI加密

安全HIPAA ePHI加密
EN

Stack Overflow用户
提问于 2010-06-30 01:16:55
回答 1查看 1.6K关注 0票数 4

我有一些休息时间,我正在考虑挑选一个新的项目为乐趣。我是一名大学生,每年我们都会在网上举办一场摊位比赛。我想创造一个项目,为这个摊位比赛,大约9个月后。问题是项目的安全性要求很高,竞争也很激烈。

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

建议的解决方案

0)将web应用程序放在防火墙后面的安全专用服务器上。

1)将文件存储在文件中,如“secure_ files /”,然后使用mod_rewrite限制对此目录的访问。

字里行间的东西:

代码语言:javascript
复制
#Removes access to the secure_files folder by users.
RewriteCond %{REQUEST_URI} ^secure_files.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

然后,如果用户拥有打开文件的权限,则使用php脚本打开文件。所以我可以用:

代码语言:javascript
复制
------
-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会话类向会话添加“用户”。

控制器检查会话是否设置:

代码语言:javascript
复制
<?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,也可以用皮塔。有谁在MySQL中使用过时间点架构(PITA)吗?你能分享你的经验吗?

5)很明显,我可以用单向盐析散列对密码进行散列。但我需要加密所有东西吗?我也不知道AES_ENCRYPT(str,key_str)是如何提高安全性的。我想这能阻止管理员查看数据库吗?我能/应该加密“secure_files/”文件夹中的所有内容吗?我可以像BitLocker那样使用完整的磁盘加密吗?

基本上,我能用php和CI实现网上银行级的安全吗?除了一文不值的“你的白痴去付专家钱,因为你什么都不知道”之外,你还能提出其他建议吗?

谢谢你抽出时间阅读这篇文章。

由Redux Auth通过

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

salt_length = '9';}公共函数哈希($password = false) { $salt_length =$$salt_length->salt_length;if ( $password === false) {返回false;} $salt =$this->$password();$password= $salt。substr(散列(‘sha256’,$salt .$password),0,-$salt_length);返回$password;}私有函数$password(){返回substr(md5(uniqid(rand(),true)),0,$this->-$salt_length);} ?>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-30 01:29:46

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

  1. 内部威胁: 系统管理员和开发人员。
  2. SQL注入: 如果您的数据库配置正确,sql注入应该只为攻击者提供对应用程序数据库的访问,而不是其他任何东西。在mysql中,一定要撤销FILE特权,因为这可以用于读取硬编码的密钥或配置文件。
  3. 更安全的备份: 层层安全。

所以很明显,我可以用单向盐析散列来加密密码。

加密不同于散列。加密意味着有一种解密数据的方法。对密码使用加密函数是CWE-257所识别的漏洞。密码必须总是使用咸散列,而沙-256是一个很好的算法.salt应该是一个密码名词,就像一个非常随机的值,每个散列只使用1。

MySQL的AES_ENCRYPT()糟透了,它使用的欧洲央行模式非常糟糕。如果函数调用没有IV --可能是欧洲央行模式,如果IV为null,那么它就违反了CWE-329。

纯文本:

使用欧洲央行模式加密:

加密是很困难的,您必须担心初始化向量、操作模式、密钥存储和string2key函数。绝大多数程序员认为密码学很容易,但他们严格地管理搞砸了。得到一份实用密码的副本,它直截了当,而且数学不重。如果你喜欢数学,那就和“手册”一起去吧。

编辑:,我不太喜欢你现在的一代,因为它的熵/尺寸比很差。当你有256碱盐的时候,base16盐是一种浪费。请记住,大多数(可能所有)消息摘要实现都是二进制安全的。此外,uniqid()在计算中花费了大量的时间,如果只使用时间,就违反了CWE-337。另一方面,兰德()踢屁股。另外,请记住,您可能应该将其存储为base64,然后在您的哈希函数中使用之前对其进行base64解码。

代码语言:javascript
复制
    public function nonce($size=32){//256 bit == 32byte. 
        for($x=0;$x<$size;$x++){
            $ret.=chr(mt_rand(0,255));
        }
        return base64_encode($ret);
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3145867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档