我有一些停工时间,我想要选择一个有趣的新项目.我是一名大学生,每年都有在线竞赛.我想为这场比赛创建一个大约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-> salt_length;
if($password === false)
{
返回false;
}
$salt = $this-> salt();
$password = $salt. substr(hash(‘sha256’,$salt.$password),0, – $salt_length);
return $password;
}
私函盐()
{
return substr(md5(uniqid(rand(),true)),0,$this-> salt_length);
}
}
?>
最佳答案 编辑:
加密sql数据库中的敏感数据可防御3种主要威胁.
>内部威胁:
系统管理员和开发人员.
> SQL注入:
如果您的数据库配置正确,sql注入应该只为攻击者提供对应用程序数据库的访问权限,而不是其他任何内容.在mysql中,请确保撤消FILE特权,因为这可用于读取硬编码的密钥或配置文件.
>更安全的备份:
层次安全.
So obviously I can encrypt the
passwords with a one way salted hash.
加密与散列不同.加密意味着有一种解密数据的方法.使用密码加密功能是CWE-257认可的漏洞.密码必须始终使用盐渍哈希,而sha-256是一种很好的算法. salt应该是Cryptographic nonce,因为在一个非常随机的值中,每个哈希值只使用1个.
MySQL的AES_ENCRYPT()很糟糕,它使用ECB mode这很糟糕.如果函数调用没有IV可能是ECB模式,如果IV为空则则违反CWE-329.
纯文本:
使用ECB模式加密:
加密很困难,您必须担心初始化向量,操作模式,密钥存储和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);
}