我有一些停機時間,我覺得選擇一個新項目的樂趣。我是一名大學生,每年我們都會舉辦網上音樂比賽。我想爲這場距離比賽大約9個月的比賽創建一個項目。問題是該項目需要非常高的安全性,而且競爭非常激烈。安全HIPAA ePHI加密
事情,我需要能夠做到: 1.存儲HIPAA或ePHI的(.PDF | .gif注意| JPG格式| .DOC) 2.強大的訪問控制 3.支持大量的用戶和文件( 1億多) 4.全審計報告(哦EPHI你是這樣的痛) 5.加密
提出的解決方案
0)將Web應用程序防火牆上的
1後面的安全專用服務器)將文件存儲在文件中說「secure_files /」,然後使用mod_rewrite限制對此的訪問d irectory。上線
東西:
#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)旋轉的多個web服務器間循環。我從來沒有這樣做,所以我不知道如何做到這一點。我不知道如何處理多個數據庫服務器。任何想法/建議?
4)使用Oracle企業標準數據庫審計。我希望我可以使用MySQL,但我找不到任何審計支持。我可以使用MySQL並使用PITA。有沒有人使用MySQL的時間點架構(PITA)?你能分享你的經驗嗎?
5)所以很顯然,我可以散列密碼與單向鹽漬散列。但是我需要加密一切嗎?另外我也沒有看到AES_ENCRYPT(str,key_str)是如何提高安全性的。我想這可能會阻止管理員查看數據庫?我可以/應該加密「secure_files /」文件夾中的所有內容嗎?我可以使用BitLocker等全盤加密嗎?
基本上可以通過php和CI實現網上銀行級別的安全嗎?除了毫無價值的「你一個白癡去付專家,因爲你什麼都不知道」的建議之外,你能否提出其他建議?
感謝您花時間閱讀本文。
從終極版驗證
採用至於單向散列。說我的錯誤加密。我通常會做類似於:
salt_length ='9'; ($ password = false) { } $ salt_length = $ this-> salt_length; if($ password === false) { return false; } $ salt = $ this-> salt(); $ password = $ salt。 substr(hash('sha256',$ salt。$ password),0, - $ salt_length); 返回$ password; } 私有函數salt() { return substr(md5(uniqid(rand(),true)),0,$ this-> salt_length); }} >
在未來,您應該嘗試將這樣的大問題分解爲更小的部分。這將是更容易回答,你會得到更多的積分:) – rook 2010-06-30 04:41:17