【问题标题】:Is a salted password and mySQL AES_ENCRYPT sufficient for storing sensitive information?加盐密码和 mySQL AES_ENCRYPT 是否足以存储敏感信息?
【发布时间】: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


【解决方案1】:

AES-128 加密的蛮力攻击是可以实现的,特别是考虑到显卡的计算能力或正在为比特币挖矿开发的一些基于 ASIC 的系统,但对于你所获得的东西来说仍然很昂贵。您可以通过更改密钥(可能贵数百倍)或使用 AES-256(贵 2^128 倍!)来使您的加密更加昂贵。

更便宜且更有可能的攻击是有人试图窃取您的密钥。您的场景假设攻击者以某种方式进入了您的数据库。尝试想象攻击者实现该目标时的有利位置。从那个有利位置来看,密钥的保护程度如何?

一些例子:

  • 数据库是从备份磁带或驱动器中获取的。您是否将密钥备份到同一磁带或驱动器?
  • 攻击者以某种方式获得了对您的数据库服务器的 root 访问权限。该服务器是否与您拥有密钥的应用服务器分开?是否有任何 SSH 证书允许从您的数据库服务器访问应用程序服务器?您的网络是否阻止从您的数据库服务器直接访问您的应用服务器?
  • 攻击者可以访问您的源代码控制管理系统。您的应用程序是否已将任何密码(例如 /var/www/secret.php 中的密码)签入源代码管理?
  • 您的管理员可能会被强迫、欺骗或贿赂以提供密钥。您是否以一种易于检测且难以掩盖的方式记录活动?在可行的情况下,您能否划分职责,使给定的管理员可以访问数据或密钥,但不能同时访问两者?
  • 如果其中一位有权访问该应用程序的人的笔记本电脑被盗,拥有该笔记本电脑的攻击者是否能够不受挑战地访问数据库?
  • 据说密码文件是只读的。运行应用程序的帐户是否为只读帐户,除 root 以外的其他任何人都无法读取?是否有其他应用程序共享该帐户?您是否阻止使用同一帐户对服务器进行 SSH 访问?该帐户的凭据是否安全?

【讨论】:

  • 谢谢@phatfingers - 读完这篇文章后,我意识到我确实需要研究源代码控制中的内容,尤其是 cmets 等......我们正在记录但还不够,所以我们必须稍微提高一下.幸运的是,我们的备份是加密的,所以我们还算不错。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 2021-04-10
  • 2012-12-26
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多