对于加密数据(数据库字段级别加密)存储和并搜索的一些调查

一、简述

        如果您认为不良行为者不可避免地会进入您的网络,那么在将敏感数据放入数据库或文档存储之前对其进行加密是保护数据的最佳方法。对于敏感数据应该这么做。这种在存储之前进行加密的方法称为应用层加密,有相当数量的公司使用它来保护其敏感数据。

        2017 年,Equifax 遭到黑客攻击,这是历史上最大的泄密事件之一。攻击者下载了 1.46 亿美国人的出生日期、社会安全号码、地址和其他敏感信息。国会关于此次攻击的报告如下:

攻击者能够使用这些凭据访问 48 个不相关的数据库。攻击者对这 48 个数据库发送了 9,000 次查询,成功定位未加密的个人身份信息 (PII) 数据 265 次。

        因为他们以明文形式存储敏感的消费者信息。

        这不是唯一一次泄密事件,还有很多,为什么这种情况不断发生呢?

        有两个答案:

        相关法律法规和监管机制并不健全。

        加密数据会使数据变得“黑暗”并难以使用。

        在企业计算中“软件即服务”趋势的推动下,越来越多的数据被外包给远程(云)存储提供商。数据所有者希望确保他们的数据安全,不会被外部人员、内部威胁和不受信任的服务提供商等窃取。为了保护数据,使用了加密。

        然而,一旦数据被加密,加密就会使数据变得更难搜索,这既是加密所需要的,也是一个巨大的操作缺点。在理想的情况下,对数据进行加密会很方便,并且仍然能够安全地搜索数据,而不会限制应用程序架构。

        如何在不限制应用程序架构的情况下保持数据加密并仍然能够安全地搜索数据? 可以尝试可搜索加密。

二、可搜索的加密方案

        当我们讨论可搜索加密时,我们假设数据以加密方式存储在数据库中。

        有一些应用程序后端与数据库交互、读取和写入数据。有一些客户端应用程序(Web 或移动应用程序或其他服务器)使用该数据。

        可搜索加密的目标是允许客户端应用程序找到所请求的数据,而无需在数据库端或应用程序后端解密它。

1、最基本的方法

(1)解密、搜索、加密

        搜索加密数据的最基本方法是将数据下载到客户端计算机,在本地解密,然后在明文数据中搜索所需的结果。由于多种原因,由于可能存在大量数据,这种方法既不实用也不可扩展。

        再加上密钥管理问题:当客户端需要解密密钥并因此可能将其和访问凭据泄露到加密存储时,如何正确处理密钥分发。

        此外,“解密+搜索”场景中加密数据的明文副本的出现使得加密变得毫无用处,因为攻击者可以找到拦截和窃取明文副本的方法。

(2)解密、运行查询、发送结果

        另一种方法让应用程序后端(服务器端)从数据库请求加密数据,对其进行解密,在服务器端运行搜索查询,然后仅将结果发送回用户。

        与上述方案类似,这引入了密钥管理问题,因为服务器现在同时拥有数据和解密密钥。

        在这种情况下,安全性会受到损害,因为受加密保护的所有记录都将泄露给有权访问服务器环境的每个服务和攻击者。

        有两种方法可以实现可搜索加密(SE)。它可以通过以能够直接在密文上执行查询的方式加密数据来完成,或者通过引入与加密数据一起存储的可搜索索引来完成。

        然而,希望在应用程序后端支持尽可能完整的搜索功能,而不解密数据,同时将数据机密性的损失降至最低。

        在正确实施的安全搜索方案中,数据库服务器和应用程序后端(服务器端)永远不会看到解密的数据。

        可搜索加密方案的典型工作流程如下所示:

         可搜索加密的多种方法。前两种——可搜索对称加密(又名 SSE,对称可搜索加密)和带关键字搜索的公钥加密(PEKS,以紫色标记)——非常流行。

         实施 SE 并不存在单一的完美方法,因为总会有一些权衡,无论是在性能、功能、安全性还是可用性方面。

        构建可搜索加密方案的主要密码技术是对称可搜索加密(SSE)和带有关键字搜索的公钥加密(PEKS)。

        基于 SSE 的方案使用对称密钥原语,并允许用户创建密文并执行安全搜索。在PEKS方案中,公钥用于创建(写入)密文,私钥用于搜索(读取)。因此,此类方案允许多用户写入,但只有一个用户(持有私钥)能够读取其他用户写入的数据。

        另外还存在与可搜索加密相关的更多模糊技术,即谓词加密(PE)、内积加密(IPE)或隐藏向量加密(HVE)。另外还有成为FHE,使用特殊的加密密码或它们的组合,这是一种新兴技术,但大多数专家表示它尚未准备好投入生产使用。

        另一种方法称为同态加密 (HE),它通常允许对密文执行计算,生成加密结果 - 解密后,它与您对明文执行类似计算的期望相匹配。

        基于 HE 的搜索方法在理论和概念验证实现中均存在,但是,对于大多数实际用例,同态加密仍然非常脆弱且缓慢。

三、实用的 SQL 数据库可搜索加密

        流行方法是使用“盲索引”。这个想法基于使用强大的、经过行业验证的密码来加密数据字段,但首先从原始字段计算“可搜索哈希”(也称为盲索引)。数据库存储字段的哈希值和加密值。当需要搜索时,后端应用程序还会计算搜索查询的盲索引,然后运行数据库命令来比较索引。当数据在 SQL 数据库中存储和处理时,这种方法尤其有效。

        还有方法是透明数据加密 (TDE) ,对数据文件进行加密。这种加密称为静态数据加密。TDE 对数据和日志文件进行实时 I/O 加密和解密。加密使用数据库加密密钥 (DEK)。数据库引导记录存储恢复期间可用性的密钥。DEK 是对称密钥。它由服务器master数据库存储的证书或 EKM 模块保护的非对称密钥保护。

        另外还有基于文本提取关键字和参数,然后通过这些参数和关键字进行搜索。

        oracle

        您可以通过以下方式加密列及其数据指定数据库表中列的某些参数的值。您还可以通过创建附加列(哈希列)来启用对加密数据的搜索,该列存储将 RSA SHA-1 算法应用于加密数据的纯文本值的结果。搜索可以区分大小写或不区分大小写,具体取决于您配置搜索的方式。

Configuring Encryption and Search on Encrypted Datahttps://docs.oracle.com/cd/E63029_01/books/Secur/secur_dataencrypt014.htm

        mysq

        基于 HMAC-SHA256 的盲索引优于简单哈希。

$first_name_hash = hash_hmac('sha256', $firstName, $secretKey);
$stmt = $db->prepare('SELECT * FROM table WHERE first_name_idx = ?');
$result = $db->execute([$first_name_hash])
    ->fetch(PDO::FETCH_ASSOC);
if ($result) {
    $first_name = Crypto::decrypt($result['first_name_encrypted'], $otherSecretKey);
}

        AWS 

        亚马逊使用称为beacons的技术进行加密数据搜索,它在写入字段的明文值和实际存储在数据库中的加密值之间创建映射。信标是截断的基于哈希的消息身份验证代码 (HMAC) 标签,用于在字段的明文值和加密值之间创建映射。当您将新值写入配置为可搜索加密的加密字段时,AWS 数据库加密开发工具包会根据明文值计算 HMAC。此 HMAC 输出与该字段的明文值进行一对一 匹配。HMAC 输出被截断,以便多个不同的明文值映射到同一个截断的 HMAC 标签。

        从以上几个示例我们可以看出,数据库处理的加密搜索的流程方式主要是使用盲索引。

四、小结

        加密后的数据,不只是搜索,还有排序等操作都会比较困难。但是加密和安全是非常重要且复杂的主题。始终应该注意到,在安全方面没有一刀切的解决方案。可搜索加密绝对是可能的,但它是否适合您的系统取决于其风险和威胁概况。有时加密的数据应该保持加密状态。 

        要决定是否应该在项目中使用可搜索加密,请根据您的情况做出选择。例如,考虑对安全搜索方案工作的性能效率和负担得起的速度的特定要求。

        另外以上的内容,均是个人对可搜索加密的一个简单调查。一定是有失偏颇,仅供参考,不喜可喷。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MongoDB的自定义加密插件可以使用MongoDB的加密扩展框架进行开发,以下是一个简单的示例: 1. 首先,需要创建一个加密插件的源代码文件,例如encrypt.js。 2. 在encrypt.js中,需要实现一个encrypt和decrypt函数,分别用于加密和解密数据。 3. encrypt函数接收两个参数:要加密字段名和要加密数据。 4. decrypt函数接收两个参数:要解密的字段名和加密后的数据。 5. 在encrypt函数中,使用加密算法对数据进行加密,并返回加密后的结果。 6. 在decrypt函数中,使用相同的加密算法对数据进行解密,并返回解密后的结果。 7. 将encrypt.js文件上传到MongoDB服务器,并使用MongoDB的loadServerScripts函数将其加载到MongoDB中。 8. 在MongoDB中创建一个加密插件的配置文件,例如encrypt_conf.json。 9. 在encrypt_conf.json中,指定要加密字段名和使用的加密算法。 10. 将encrypt_conf.json文件上传到MongoDB服务器,并使用MongoDB的loadServerConfig函数将其加载到MongoDB中。 11. 在MongoDB中创建一个集合,并在集合的Schema中指定要加密字段。 12. 使用MongoDB的加密扩展框架将加密插件和配置文件与集合关联起来。 13. 现在,对于指定的字段,MongoDB会自动调用加密插件中的encrypt和decrypt函数,确保数据存储和传输过程中得到加密保护。 需要注意的是,自定义加密插件需要具备高强度的加密算法和密钥管理机制,以确保数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐望云起

如果觉得有用,请不吝打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值