2008-10-24 113 views
10

我打算使用MySQL及其内置的加密功能来加密/解密某些表中的某些列。我担心的是我需要将密钥存储在某个地方。我当然可以将密钥存储在一个文件中,并控制该文件的权限以及访问该文件的应用程序的权限,但这足够吗?我也可以创建一个Web服务来获得密钥或其他东西。在MySQL中使用/存储加密密钥的最佳方法是什么

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

我已经看了广告的恶心,但没有人似乎有一个防弹答案。

难道这就是你需要解决的问题吗?鉴于我正在使用MySQL和PHP(可能是Python)是否有更好的方法来处理这个问题?

+0

加密列的目的是什么?当然,聪明的做法是通过应用程序加密行中的敏感数据,并将盐与行一起存储,以便解密更加困难。 – Aupajo 2008-10-24 02:22:51

回答

6

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

PHP的M_CRYPT包被认为是相当不错的,它使您能够灵活地选择最适合您需求的算法。

将您的密钥存储在某些其他服务器上有一大优点:密钥与加密数据不在同一台机器上*)。所以只要攻击者没有足够的权限控制被盗用的机器,他们就无法进入密钥。
如果攻击者完全控制数据存储在机器上,他们很可能会向Web服务查询密钥。

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

*)另一种方法是在网络服务器启动时输入密码并且只保存在内存中。

可能的解决方法
如果看到采用的解决方案,使用下面的方法用于与网络接入用户的加密文件(我不知道你的环境,但它可能会有所帮助):

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

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

但是:
如果攻击者得到主密码的保持和已经阅读访问用户表,整个系统,再次,破损。

1

看来您正在考虑使用'专用'按键与'AES_ENCRYPT'和'AES_DECRYPT'一起使用。正如评论者所说,这是一个坏主意,因为任何入侵都可以访问所有数据。

如果您使用“用户提供的”密码,使用/不使用盐,您会更安全。这就是说,如果加密密钥只能被使用它的应用程序读取,那么你可能'够用'了。如果该机器陷入困境,他们将通过一个密钥更快地获取数据。

4

我可能会将其存储在非Web可访问目录中的文件中,并尽可能使用文件系统权限锁定。

您的面向Web的脚本不应该使用变量打开任何文件系统文件,尤其是用户提供的文件。甚至不要让他们选择滑动通过输入过滤器的东西(您正在过滤用户提供的数据?),并可能放弃密钥文件的内容。保持文件路径为硬编码字符串,并仅定义()。由于大部分数据都存储在MySQL中,所以这不应该成为问题。

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

如果你和另一个人是唯一能够物理访问机器的人,这可能就好了。如果有人闯入并盗取了这个盒子,那么他们已经得到了所有的数据,所以游戏结束了。

相关问题