代码之家  ›  专栏  ›  技术社区  ›  Chris Kloberdanz

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

  •  11
  • Chris Kloberdanz  · 技术社区  · 16 年前

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

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

    我看起来很恶心,但似乎没有人能给出可靠的答案。

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

    3 回复  |  直到 16 年前
        1
  •  8
  •   Jacco    15 年前

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

    PHP的 M_CRYPT 软件包被认为是相当好的,它让您可以灵活地选择最适合您需要的算法。

    将密钥存储在其他服务器上有一个很大的优势:密钥与加密数据不在同一台机器上 *)
    如果攻击者获得对存储数据的机器的完全控制权,他们很可能能够查询web服务以获取密钥。

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

    *)

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

    • 在创建用户时,将为新用户分配一个长随机密钥。
    • 此随机密钥存储在用户记录的加密列中。
      ( )

    • 更好的选择是在启动Web服务器时输入密码,并且只将其存储在内存中。 )
      ( 另一种方法是让用户输入密码并使用该密码加密/解密随机密钥列,但我不确定这是否会增加或降低安全性
    • 每个需要加密的文档都使用该用户的随机密钥加密,然后存储在磁盘上。
    • 文档以最低权限存储在文件系统中。

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

    然而:
    如果攻击者获得主密码并具有对用户表的读取权限,则整个系统再次被破坏。

        2
  •  4
  •   Bob Somers    16 年前

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

    进行解密时,将密钥读入一个干净初始化的变量,进行解密,然后覆盖密钥变量(比如用一个x字符串)并取消设置该变量。这听起来可能有点偏执,但如果你尽量减少键在内存中的时间,并将其与PHP脚本周围的所有其他变量隔离开来,那么你就不会有任何改变 较少的

    如果您和另外一个人是唯一可以物理访问机器的人,那么这可能很好。如果有人破门而入,偷走了盒子,那么,他们已经得到了你所有的数据,所以游戏结束。

        3
  •  1
  •   Chris    16 年前

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

    如果您使用“用户提供的”密码(含/不含salt),您将更加安全。

    也就是说,如果加密密钥只能由使用它的应用程序读取,那么您可能“足够好”。如果机器被入侵,他们只需一把钥匙就能更快地获取数据。