有没有办法过滤 aes 256 gcm 加密数据库中的数据?

Posted

技术标签:

【中文标题】有没有办法过滤 aes 256 gcm 加密数据库中的数据?【英文标题】:Is there a way to filter data in aes 256 gcm encrypted database? 【发布时间】:2021-12-03 13:20:06 【问题描述】:

我有一个数据库,其中包含使用 aes 256 gcm 加密的敏感信息。但是我必须在将数据发送到前端之前对其进行过滤。目前,我获取所有数据并在应用程序中对其进行过滤。它现在工作正常。但我认为,当数据库变得更大时,将来可能会成为一个问题,而我目前解决这个问题的方法会很慢而且不是最优的。但我不知道如何在应用程序中加密的加密行中进行搜索。

例子:

id email(not encrypted) firstname(encrypted)
1 qwerty@qwerty.com DPTR0zNqreWoZUwajRcJJtMlgji7TrSuzcuPbDfIsqvc6g=
2 qwerty@qwerty1.com DCAvCh1JewOIJl3EQprmgnfy9VT5r6BGFGuyqkBpicNM

如果用户 1 的名字是 Patrick,而用户 2 的名字是 Joe,我如何让所有用户使用 SQL 查询,名字以 Pat 开头...

【问题讨论】:

你对每一行使用相同的键吗? IV是如何产生的?可以进行可搜索的加密,但是,您应该很好地定义您的模式和查询,以便真正可以帮助您。答案建议您将密钥发送到数据库服务器。这对您有安全风险吗?如果没有,为什么要加密? 我没有为每一行使用相同的键。 IV 是使用 node.js 加密函数 crypto.randomBytes(12) 生成的。 如果您不使用相同的密钥,那么您需要解密所有行才能看到匹配的行。有什么不使用 AES-GCM-SIV 的具体原因吗? SIV 防止使用继承自内部 CTR 模式的 GCM 模式的 IV 重用问题。 【参考方案1】:

SELECT * FROM tablename WHERE AES_DECRYPT(firstname,[KEY])='Pat%'

这应该可以解决问题,它会解密每个名称并将其与给定的字符串进行比较。 请记住,您通过连接发送加密密钥,如果 sql 服务器与客户端位于同一台机器上,则它是安全的,否则您可以使用 f.e. SSL/TLS

【讨论】:

这是否能够使用 gcm 模式解密 256 位密码?另外,我忘了提到数据是用多个密钥加密的。我们每个月都会更改密钥。 好吧,我不知道您如何准确加密数据,但我想使用多个 AES_DECRYPTS 会有所帮助。此外,据我所知,gcm 模式仅用于性能,因此相同的输入相同的输出,但我对此并不了解。

以上是关于有没有办法过滤 aes 256 gcm 加密数据库中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

AES_GCM_256加密

AES_GCM_256加密

Nodejs AES-256-GCM 通过 webcrypto api 解密加密的客户端消息

golang 在golang中使用AES256 GCM加密文本

Nodejs AES-256-GCM 在客户端通过浏览器 webcrypto api 加密和解密

跨平台AES 256 GCM Javascript和Elixir