【发布时间】:2013-04-22 01:50:47
【问题描述】:
我正在通过 HTTPS 使用 Apache、MySQL 和 PHP。
我需要能够存储敏感信息,以便可以在多人之间共享。 如果我有一个数据库(秘密)和两个 php 文件:(/var/www 是我的网络根目录)
/var/inc.php
/var/www/secret.php
在 /var/inc.php 中,我有一个名为 $enckey 的变量,它是一个 32 个字符的字母数字字符串。其权限设置为只读。
在secret.php 中,我有一个用户名、密码和密钥字段。它们的键字段 ($key) 是所有用户都知道的字符串(每个人都有相同的键,因为我将它用作 salt 的一部分),它将是一个带有特殊字符串的 8-12 字母数字。
每个人都有自己的用户名和密码,它们也是 MySQL 用户/密码。当他们登录时,他们的用户凭据将首先使用 MySQL 进行验证。 /var/inc.php 中没有数据库用户名或密码。
我的秘密数据库有一个表,secret,如下所示:
CREATE TABLE `secret` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
如果我使用以下方法将信息存储在 MySQL 表中:
AES_ENCRYPT('secret data', $enckey . $key)
并使用
提取数据AES_DECRYPT(`secret`.`data`, $enckey . $key)
我做的足够多以保证存储在 MySQL data 列中的数据安全吗?我应该做更多/不同的事情吗?
更新: 任何获得网站访问权限的人(任何拥有有效用户名/密码的人)都可以访问所有敏感数据。目标是防止第三方以某种方式访问数据库。
【问题讨论】:
-
当我阅读它时,这是关于保存需要用户阅读的敏感数据。密码没有加密,数据是。重点是——如果我没看错的话——把它倒过来,否则数据有点……不可用。 (啊。我回复的评论不见了)
-
@Nanne 正确 - 我们需要能够存储数据,然后再检索它。我没有存储密码来验证用户访问权限。
-
“所有用户都知道”是什么意思?每个用户对
$key使用相同的值? -
AES 是安全存储敏感信息的当前标准。如果您使用的是 256 位密钥,那么您正在实施公共领域中最安全的算法之一。但是,您也使用相同的密钥来加密所有信息。这意味着如果您的表中的一个元组被破解,则整个表都被破解。
-
@Jason 想到的最简单的方法是使用他们的密码(或密码的消息摘要)作为密钥。这样,只有具有特定密码的用户才能解密该信息。
标签: mysql encryption