【问题标题】:What's the best method to use / store encryption keys in MySQL在 MySQL 中使用/存储加密密钥的最佳方法是什么
【发布时间】:2010-09-18 22:26:11
【问题描述】:

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

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

我看得很恶心,但似乎没有人有一个万无一失的答案。

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

【问题讨论】:

  • 加密列的目的是什么?当然,明智的做法是通过您的应用程序加密行的敏感数据,并将盐与行一起存储,以便更难解密。
  • 我想我的意思是使用 AES_ENCRYPT 加密每一行中的某个字段。所以让应用程序加密和解密比 MySQL 函数更好,或者你只是说我应该在调用 MySQL 函数时为每一行都有一个唯一的加盐密钥

标签: php mysql security encryption key


【解决方案1】:

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

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

将您的密钥存储在其他服务器上具有一大优势:密钥与加密数据不在同一台机器上*)。因此,只要攻击者对受感染的机器没有足够的控制权,他们就无法获得密钥。
如果攻击者完全控制了存储数据的机器,他们很可能能够向 Web 服务查询密钥。

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

*) 另一种选择是在网络服务器启动时输入密码并仅保存在内存中。

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

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

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

但是:
如果攻击者掌握了主密码并拥有对用户表的读取权限,那么整个系统将再次崩溃。

【讨论】:

    【解决方案2】:

    我可能会将它存储在一个不可通过网络访问的目录中的文件中,并尽可能使用文件系统权限锁定。

    您的面向 Web 的脚本不应使用变量打开任何文件系统文件,尤其是用户提供的文件。甚至不要让他们选择通过输入过滤器传递某些内容(您正在过滤用户提供的数据,对吗?)并可能放弃密钥文件的内容。只保留硬编码字符串的文件路径和define()。由于您的大部分数据都存储在 MySQL 中,因此这应该不是问题。

    在进行解密时,将密钥读入一个干净初始化的变量中,进行解密,然后覆盖密钥变量(比如用 x 的字符串)并取消设置变量。这可能听起来有点偏执,但是如果您将密钥在内存中的清除时间最小化,并将其与 PHP 脚本周围的所有其他变量隔离开来,它就不会让您有任何 less em> 安全。

    如果您和另一个人是唯一可以物理访问机器的人,那么这可能没问题。如果有人闯入并偷走了盒子,那么无论如何,他们已经掌握了您的所有数据,所以游戏结束。

    【讨论】:

      【解决方案3】:

      您似乎正在考虑将“特定于列”的密钥与“AES_ENCRYPT”和“AES_DECRYPT”一起使用。正如评论者所说,这是一个坏主意,因为任何入侵都可以访问所有数据。

      如果您使用“用户提供的”密码,无论是否加盐,都会更加安全。

      也就是说,如果加密密钥只能由使用它的应用程序读取,那么您可能已经“足够好”了。如果机器被闯入,他们将通过一个键更快地获取您的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2011-10-10
        相关资源
        最近更新 更多