在 MySQL 中使用/存储加密密钥的最佳方法是什么

2023-11-24

我计划使用 MySQL 及其内置加密功能来加密/解密某些表中的某些列。我担心的是我需要将密钥存储在某个地方。我当然可以将密钥存储在文件中并控制该文件的权限以及访问它的应用程序的权限,但这足够了吗?我还可以创建一个网络服务来获取密钥或其他东西。

我在一家小商店里,我是唯一一个(可能还有其他人)可以访问应用程序所在机器的人。编辑:我应该补充一点,该应用程序有一个面向 Web 的部分,除非我添加了一层,否则需要解密数据。

我看起来很恶心,但似乎没有人能给出一个万无一失的答案。

这是您必须满足于足够好的问题之一吗?鉴于我正在使用 MySQL 和 PHP(可能是 Python),是否有更好的方法来解决这个问题?


我不确定使用 MySQL 内置加密是否是解决您问题的最佳方案。

PHP's M_CRYPT软件包被认为非常好,它使您可以灵活地选择最适合您需求的算法。

Storing your key on some other server has one big advantage: the key is not on the same machine as the encrypted data*). So as long as the attacker does not have enough control over the compromised machine, they cannot get to the key.
If the attacker gains full control of the machine the data is stored on, they most likely will be able to query the web-service for the key.

然而,将密钥从一台机器传输到另一台机器开辟了一个需要保护的全新区域。可能涉及更多密钥和更多加密层,从而增加了出错的机会。

*) The other option is to enter the password upon webserver start up and only keep it in memory.

可能的解决方案
如果看到采用的解决方案使用以下方法为具有 Web 访问权限的用户加密文件(我不确定您的环境,但它可能会有所帮助):

  • 创建用户后,将为新用户分配一个长随机密钥。
  • 该随机密钥存储在用户记录的加密列中。
    (仅此列被加密,以免影响其余记录的性能!)
  • 随机密钥列的加密是使用 1 个主密码完成的,存储在文件或内存中。
    (更好的选择是在启动网络服务器时输入密码,并将其仅存储在内存中。)
    (另一种方法是让用户输入密码并使用它来加密/解密随机密钥列,但我不确定这是否会增加或降低安全性)
  • 每个需要加密的文档都使用该用户的随机密钥进行加密,然后存储在磁盘上。
  • 文档以最小权限存储在文件系统中。

这种方法的优点是:
1. 随机密钥在数据库中被加密。因此,您仍然可以获得数据库服务器与加密列相结合的额外安全性。 2. 文档使用不同的密钥存储,如果攻击者掌握了密钥,则仅部分文档被泄露。

However:
如果攻击者掌握了主密码并具有对用户表的读取权限,则整个系统将再次被破坏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MySQL 中使用/存储加密密钥的最佳方法是什么 的相关文章

随机推荐

  • Android - AlertDialog 样式

    我的应用程序中有一个警报对话框 如下所示 我希望标题和分隔标题 消息正文的线为橙色 我怎样才能做到这一点 我尝试的是使用自定义样式 如下所示 但这没有用 我的警报对话框代码 AlertDialog Builder alertDialog n
  • pymc3:具有多个观察变量的分层模型

    我有一个简单的分层模型 其中有很多个体 我有来自正态分布的小样本 这些分布的均值也遵循正态分布 import numpy as np n individuals 200 points per individual 10 means np r
  • 将 bytea 转换为二进制字符串

    我需要解码一个 Base64 字符串并获取一块二进制文件 Postgres中是否有一个SQL函数可以简单地转换bytea转换为二进制字符串表示形式 Like 00010001010101010 如果您的 Postgres 安装使用默认设置运
  • 如何选择具有给定类名的第一个、第二个或第三个元素?

    如何在元素列表中选择某个元素 我有以下内容 div class myclass my text1 div div p stuff p div div p more stuff p div p span Hello World span p
  • PHP GD如何在一条线上绘制文本

    The final output should be like image HELLO WORLD 这就是我正在做的 im imagecreate 400 400 txtcol imagecolorallocate im 0xFF 0x00
  • Android 打开外部存储目录(sdcard)用于存储文件

    我想打开外部存储目录路径以编程方式保存文件 我尝试过但没有获取 SD 卡路径 我该怎么办 有什么解决办法吗 private File path new File Environment getExternalStoragePublicDir
  • 延长课程是一个好的做法吗?

    我的数据库类中有一个 PDO 连接 最近我一直使用它作为其他类的扩展 即class Users extends Database这使我能够始终保持数据库连接 而无需在我的 Users 类中拥有函数 然而 有人指出我不应该这样做 因为这是一种
  • 分号有什么作用?

    我在网上找到了一个函数来帮助我完成当前的项目 并且它的某些行上有分号 我想知道为什么 是为了破坏功能吗 def containsAny self strings alphabet abcdefghijklmnopqrstuvwxyz0123
  • JQuery/JQuery UI 水平分隔线

    最近 我正在开发一个网站 我想创建一个水平分隔线 能够使用 jquery 调整页面上两个元素的大小 基本上 Content 您还可以查看UI Layout jQuery 插件 这是一个demo
  • 如何在链接的 npm 依赖项(开发中)和已安装的依赖项(暂存/生产中)之间切换?

    我正在开发一个自定义 npm 模块 并且它有一个 GitHub 存储库 我还在开发一个使用自定义模块的项目 当处理较大的项目时 使用它是很好的npm link这样我就可以对模块进行更改并立即在主项目中看到它们 To deploy to st
  • 在flutter中,如何将facebook受众作为中介网络与Admob集成?

    我是广告中介新手 我有一个 flutter 应用程序 并且使用以下 admob flutter 插件集成了 admob 并且它在 Android 和 iOS 上运行良好 https pub dev packages admob flutte
  • 暴雪官方魔兽世界 API 在哪里?

    我想知道是否可以通过 API 访问 魔兽世界 我的要求非常明确 必须是暴雪官方API 必须可以在游戏外访问 暴雪现已发布社区 API 允许您直接从暴雪服务获取信息 例如领域状态 玩家和拍卖数据 https dev battle net io
  • 使用构建参数构建 Docker 映像并将其从 DevOps 推送到 ACR

    我正在 Azure DevOps 管道中构建 Docker 映像 然后我想将其推送到 Azure 容器注册表 注册表已创建 并且我已配置 DevOps 来使用它 还有buildAndPushDocker任务 works 然而 由于 Dock
  • Android - 检索联系人照片并显示

    我正在创建一个简单的应用程序 用于检索每个联系人的姓名和电话号码 并在列表视图中显示 并在行开头的缩略图大小的图像视图中显示联系人的照片 我已成功检索并显示姓名和号码 但在浏览了许多教程和堆栈后未能显示照片 我最终将其恢复为仅显示姓名和号码
  • 如何生成动态 GRF 图像以进行 ZPL ZEBRA 打印

    我有个问题 我正在生成动态 BMP 图像并尝试通过 ZPL 命令将其发送到 ZEBRA 打印机 我需要将 BMP 图像转换为 GRF 图像 我认为 BMP 图像提取的十六进制不正确 打印的图像模糊且不正确 这是我的代码 string bit
  • 在java中计算两个双精度数的余数

    我有以下代码 Double x 17 0 Double y 0 1 double remainder x doubleValue y doubleValue 当我运行这个时 我得到余数 0 09999999999999906 知道为什么吗
  • 在 JavaFX 控制器中获取单击对象的 id 的更好方法

    我正在寻找一种更好的方法来获取该对象的事件处理程序中单击的对象的 id 我已经找到了这个 javafx 将 fx id 传递给控制器 或 fxml onAction 方法中的参数 但这对我不起作用 现在我使用节点类的 getId 函数 如下
  • 如何使用 boost::spirit 匹配 unicode 字符?

    如何使用 utf8 unicode 字符匹配boost spirit 例如 我想识别这个字符串中的所有字符 echo a out 当我尝试这个简单的boost spirit程序将无法正确匹配 unicode 字符 include
  • Spark csv读取速度很慢虽然我增加了节点数

    我在 Google Compute Engine 上创建了两个集群 这些集群读取 100 GB 数据 集群一 1 个主控 15 GB 内存 250 GB 磁盘 10 个节点 7 5 GB 内存 200 GB 磁盘 集群二 1 个主控 15
  • 在 MySQL 中使用/存储加密密钥的最佳方法是什么

    我计划使用 MySQL 及其内置加密功能来加密 解密某些表中的某些列 我担心的是我需要将密钥存储在某个地方 我当然可以将密钥存储在文件中并控制该文件的权限以及访问它的应用程序的权限 但这足够了吗 我还可以创建一个网络服务来获取密钥或其他东西