我在一家小公司工作,实际上是我(程序员)和所有者。所有者要求我加密数据库中的几个字段,以保护客户数据。这是一个网络应用程序,可帮助律师事务所管理其数据,因此基本上可以存储人员和诉讼信息(被起诉的人,原因,金额)。他认为这些不容易看到的敏感信息。他担心的是“我不要未经授权的人看到此信息”。只有其他律师事务所可能对此数据感兴趣,因此例如,它不应该像信用卡一样重要。

我已经在网络上阅读了很多关于此的内容,并且我在思考只需在这些字段上使用对称加密,这样性能就不会太差。密钥将存储在服务器上。但是,这个stackoverflow上的线程说这是个坏主意。我不担心光盘会被盗,因为它们位于Amazon EC2上。我不是安全专家,但是我认为,如果有什么地方可能出问题,我会说数据库泄漏。即使这样,重要信息也会被加密。现在,如果这个家伙设法入侵了我的EC2服务器,那么我想那将几乎没有保护措施。因为我们是一家小公司,所以我们只有一台服务器来完成从提供页面到存储数据的所有工作。对称密钥,该密钥保存在此服务器上,好吗?

评论

“他认为这种敏感信息不应该轻易看到。”见过谁?谁应有权访问此数据?什么是威胁模型?

抱歉,要澄清一下,他指的是可以入侵系统并获得对系统非法访问权限的人。

看看:zerodb.com和en.wikipedia.org/wiki/Homomorphic_encryption

这是一个古老的方法,但是我想补充一点,您可以很好地将加密/解密机制和密钥与实际数据库分开,以提高安全性。同样,虽然对数据库中的敏感数据进行加密(例如密码)并不能解决所有问题,但从某种程度上讲,这是对使用未加盐密码或明文密码的灾难数量进行体面安全的基本要求。分离和加密可以缓解许多问题。

#1 楼

普通的留言。听起来,这对您和您的老板在继续之前学习一些基本的安全性概念很有帮助。安全是一个专业领域。您不会在街上要求随机的人对您进行心脏直视手术;而且您不应该期望普通的软件开发人员知道如何保护您的系统。

我在这里感觉到一些误解。例如,听起来您的老板已经将安全性等同于加密技术。但这是一个错误。正如Bruce Schneier所强调的那样,密码术不是魔术小精灵,您可以将其撒在系统上以使其安全。正如罗杰·尼德姆(Roger Needham)曾说过的那样:如果您认为加密技术可以解决您的问题,要么您不了解加密技术,要么您不了解您的问题。

保护计算机系统安全时,一项重要概念是威胁模型。这意味着您需要仔细考虑您想阻止哪些攻击和对手,而不是阻止什么。未能仔细考虑威胁模型可能会导致安全领域:乍一看看上去不错,但实际上在实践中却严重不足的安全机制。良好的安全管理通常可以归结为风险管理:仔细分析最严重的风险是什么,然后制定缓解或管理这些特定风险的策略。最弱链接属性:系统的安全性仅与最弱链接一样强。系统任何一部分中的漏洞都可能损害整个系统的安全性。这意味着没有一个答案足以保护您的系统。相反,为了保护您的系统,您必须在许多地方获得正确的安全性。

深入细节。听起来您的目标是防止未经授权就泄露敏感数据。如果是这样,您将需要专注于许多项目。没有一种简单的魔术银弹可以为您解决这个问题。您通常需要在应用程序安全方面进行工作。 br />应用程序安全性。您需要开始研究Web应用程序的安全性。您对问题进行多少加密都无关紧要;如果攻击者可以在您的应用程序代码中发现一个安全漏洞,那么您将被困。对于Web应用程序安全性的背景知识,OWASP具有许多出色的资源。确保您了解OWASP十大知识,XSS,SQL注入,输入清理/验证,输出转义,白名单和其他概念。
访问控制。您的Web应用程序需要具有可靠的访问控制,以确保系统的一个用户无法访问另一用户的信息(未经授权)。具体细节取决于特定系统的具体情况,因此,如果您需要其他帮助,则可能需要发布一个单独的问题,其中包含有关您的应用程序和当前访问控制策略的更多详细信息。 >身份验证。您的Web应用程序将需要一种验证其用户身份的方法。标准的省力方案是仅使用用户名和密码。但是,这在实践中具有严重的局限性,这是众所周知的。如果用户选择自己的密码,他们通常会选择错误的密码,这会破坏系统的安全性。
安全的软件开发生命周期。您需要将安全性集成到软件开发过程中。在设计软件体系结构时,您应该考虑安全要求并执行威胁建模和体系结构风险分析。编写代码时,您需要了解可能会破坏安全性的常见实现错误,并确保避免发生这些错误。构建软件后,您需要测试其安全性并不断评估您在安全性方面的表现。在部署软件时,您的操作人员需要知道如何安全地对其进行管理。 Microsoft在安全软件开发生命周期(SDL)上拥有一些出色的资源。另请参见BSIMM。
安全评估。如果您担心安全性,建议您评估应用程序的安全性。一个简单的起点可能是让某人对您的Web应用程序进行渗透测试,以检查某些常见错误。这绝不是安全的保证,但是如果存在许多主要问题,有时它可以起到唤醒作用。您可能会查看WhiteHat Security的服务;还有很多其他人将进行网络渗透测试。

如果您感到这不是一件小事,我深表歉意,但确实如此。另一方面,好消息是那里有很多资源,而且您不必成为专家级的安全专家:您只需要熟悉一些基本概念和一些常见的安全性即可。 Web编程中的错误,它将满足您的大多数需求。

#2 楼

如果数据库被盗,对数据库中的数据进行加密将保护信息。但是,它不会采取任何措施来保护网站免受攻击。例如,通过猜测用户名/密码。
如果某人破坏了服务器,则可能会使某人的速度变慢,因为他们必须找到密钥,但不会阻止他们。它的价格也确实很高。例如,无法以任何有效的方式搜索加密的字段。
您还需要注意备份的含义,并确保备份密钥,最好与数据库备份分开备份,以防止数据库被解密如果备份磁带被盗。并且您需要确保拥有密钥的多个副本并定期对其进行测试。

#3 楼

SoA的一个很好的概念是让加密服务与服务器上的其他进程隔离运行(您的Web应用程序也应隔离运行!)。然后,当您需要加密/解密对象/字段时,将纯文本/加密文本发送到加密服务,并以crypttext / plaintext返回。这样,即使您的Web应用程序遭到破坏,攻击者也无法读取加密密钥,因为只有加密服务才知道该密钥。另外,由于您的Web应用程序是孤立的,因此他在您的系统上可以执行的操作受到严格限制。服务隔离通常是通过MAC系统完成的,例如SElinux,TOMOYO(比SElinux imo容易使用),AppArmor。另外,我建议运行以grsecurity修补的最新Linux内核。

评论


“这是一个可帮助律师事务所管理其数据的网络应用程序”

–矩阵
2012年7月7日在18:29

哎呀。无论如何,我们仍然缺少有关访问控制的信息。

–好奇
2012年7月7日在18:39

@curiousguy-他正在构建此Web应用程序,作者正在寻找有关如何以正确方式进行操作的想法。

–猎犬
2012年7月9日在11:27

如果Web应用程序受到威胁,是什么阻止了攻击者将加密文本发送到加密服务并取回纯文本?那里不需要钥匙。

–奇堡
14年6月19日在8:39

@chiborg我知道唯一可能的方法是通过“动态评估漏洞”(eval()函数)。如果可以这样做,他们还可以操纵内部应用程序状态,为自己授予管理员特权等。SoA+严格的MAC可以抵御其他攻击。

–矩阵
14年6月25日在9:08

#4 楼

简短答案:是,请使用对称加密。这样可以防止某些攻击,例如通过sql注入读取sql数据。但是,如果您的Web应用程序受到攻击,则可能没关系。
如果某人获得对您服务器的足够访问权限,您几乎将无能为力。即使使用非对称加密。