如果应用程序访问数据库中的加密数据,这是否意味着应用程序具有解密密钥?

信息安全 加密 Web应用程序 数据库 保密
2021-08-27 08:09:02

我正在使用一个链接到包含机密数据(数字)的数据库的应用程序。根据开发人员的说法,这些数据是加密的。但是,我可以轻松生成一份以明文形式显示数字的报告。如果这些数据被加密,应用程序如何访问和获取这些数据?如果应用程序访问数据,那么加密首先有什么好处?在这种情况下,攻击可以从 Web 应用程序开始,这将克服加密......

2个回答

这是针对(某些形式的)SQL 注入或任何可以以其他方式访问数据库的人(您的数据库服务器上的内部漏洞)的预防措施。该应用程序将执行以下操作:

Fetch information from DB ==> use decrypt function on information ==> present to the user

而在使用 SQL 注入时,您将直接使用注入的查询来提取数据。但是,由于您无法调用应用程序使用的解密函数(因为这是应用程序代码的一部分),您只能获取加密数据。

这可能不适用于您可以使用 SQL 注入的所有情况。如果一个函数易受 SQL 注入攻击,其中有代码循环遍历结果数组并解密该信息,并且您可以修改该函数收集的结果(例如通过注入 1=1语句)。你会得到那些解密的结果返回给你。

请注意,数据库加密只是强化数据驱动应用程序的安全措施的一部分。您还可以查看RSA 的这篇论文

加密是为了确保机密性加密并不能绝对确保机密性,但它将问题转化为密钥:当数据被加密时,只有有权访问解密密钥的实体才能读取它。密钥不需要与数据本身存储在同一位置,这就是我们在这里讨论的那种分离。也就是说,加密数据在数据库中,但解密密钥在应用程序中,应用程序可以是不同的机器——因此这可以防止攻击者查看数据库服务器,但不能查看应用程序机器。

正如@Lucas 指出的那样,只要解密在 SQL 中不可行,这对某些形式的 SQL 注入有效。一些数据库具有自己执行加密的能力,因此 SQL 注入攻击可能会利用这些能力。作为一个极端的例子,考虑一下微软所说的 SQL Server 中的透明数据加密:所有数据都是加密的,但这是由数据库服务器本身自动完成的;应用程序甚至不知道它。这提供了针对 SQL 注入和其他应用程序级黑客攻击的零(nil、void、nada)保护。TDE 只针对不通过 SQL Server 代码读取存储介质的人。

劫持应用程序机器的攻击者将能够读取整个数据库并对其进行完全解密,因此加密无法防止这种情况。事实上,数据库加密实际上提供额外保护的可信场景相对较少(与密码散列相反,它是单向的,并且作为第二道防线提供了很多额外的保护)。