我正在从我的 Web 应用程序 API 加密和解密我的数据库数据。如果我的网络服务器遭到入侵,如何阻止某人使用相同的方法检索数据?
例如,假设我的 Web 服务器上有一个 PHP 应用程序,它执行数据库加密/解密。如果 Web 服务器受到威胁,是什么阻止了某人访问密钥和解密数据。
问题不是特定于语言的,问题在于存储 Web 应用程序可以使用的密钥,但对于对服务器具有管理访问权限的人仍然是安全的。
我正在从我的 Web 应用程序 API 加密和解密我的数据库数据。如果我的网络服务器遭到入侵,如何阻止某人使用相同的方法检索数据?
例如,假设我的 Web 服务器上有一个 PHP 应用程序,它执行数据库加密/解密。如果 Web 服务器受到威胁,是什么阻止了某人访问密钥和解密数据。
问题不是特定于语言的,问题在于存储 Web 应用程序可以使用的密钥,但对于对服务器具有管理访问权限的人仍然是安全的。
这里的答案很好(@blowdart 和@Tate),但要考虑的重要一点是,如果您的网站遭到入侵,就安全性而言,它就是游戏结束 - 您已经被控制了。
恶意接管代码可以为您的网站做任何事情,包括访问您的代码、运行进程、数据库等。这意味着,无论您如何进行加密,无论您将密钥放在哪里,他们都可以获取并解密你的数据也是。无论您尝试什么,充其量只是默默无闻 - 最坏的情况是,他们可以让您的代码完成硬解密工作,然后再拦截它。
完成此操作后,我已将加密完全从 Web 服务器移开。基本上我有以下情况
基本上,Web 服务器调用加密服务器上的 Web 服务,该服务仅在内部网络上可用,并显示“这是一些数据,以及数据的类型”。加密服务器根据数据类型决定密钥大小、密钥到期时间等,用新的对称密钥和盐对其进行加密,并传回二进制 blob 和密钥标识符。然后,加密服务器将密钥存储在它自己的 SQL 数据库中,但首先使用 X509 证书对其进行保护,只有加密服务可以访问该证书 - 因此,如果您设法远程访问数据库,它就没有用,因为您仍然需要操作系统访问权限获取 X509 证书以解密密钥,并且无论如何数据都保存在其他地方。
加密服务器管理员密码保存在“密码箱”中,需要两个不同的人组合他们的部分来获取密码。
这意味着开发人员不必担心要使用什么算法,或者安全密钥存储,因为它由加密服务器负责,并且您可以在流程更改或新规则出现时更新使用的算法,而无需更新任何内容除了加密服务器。只有运行 Web 应用程序的进程才能调用加密服务器,普通用户帐户,甚至管理员帐户都不能。可以查看 Web 数据库的数据库管理员只能看到加密数据,也无法访问密钥。
即使 Web 服务器被入侵,它的功能仍然有限,调用加密服务器获取密钥,然后调用数据存储数据库获取密钥引用的数据。如果妥协只是运行任意代码的能力,而不知道这些事情是如何发生的或服务器位于内部网络上的什么位置,则很难做到。
当然,如果妥协是生根,并且攻击者可以获取您的代码并模拟进程,那么所有的赌注都没有 - 但情况总是如此。
我认为目前关于所有数据库安全性的最佳资源是 Securosis 的论文:
了解和选择数据库加密或标记化解决方案
本文包括对主要数据库加密和标记化技术的描述、帮助确定哪种加密类型最适合您的决策树,以及来自实际部署的示例用例。如果您正在考虑任何数据库加密或标记化项目,本文应该可以为您节省数小时的研究和架构开发时间。
PDF 的直接链接:http: //securosis.com/reports/Securosis_Understanding_DBEncryption.V_.1_.pdf
首先,这是一个非常棘手的问题。基本问题是,如果您的 Web 应用程序有足够的知识来解密数据,那么如果它被劫持,它将有足够的信息来解密数据。你真的必须从那里开始。这意味着几件事。
如果您信任您的应用程序来解密数据,那么如果它被接管,它可以解密所有数据。
如果您不信任您的应用程序来解密数据,那么它可能会被某些纯文本集信任。
一种选择是在您的应用程序和处理加密和解密的数据库之间建立一个服务。这可以设计为需要两个人一起工作才能将密钥存储在内存中,但即使不是这样,您仍然可以获得一些纵深防御。如果您的 Web 应用程序被接管,它只能访问解密服务可以获取的内容,因此缓解可以成为该策略的一部分。然后,攻击者必须破坏您的解密/加密服务才能访问原始数据(工作中的深度防御)。
(老实说,我倾向于将此加密/解密服务与数据库合并,但可以编写有关如何为任何给定 RDBMS 安全地执行此操作的书籍,这不是一个简单的解决方案。)