11

I'm looking at using a crypto lib such as pycrypto for encrypting/decrypting fields in my python webapp db. But encryption algorithms require a key. If I have an unencrypted key in my source it seems silly to attempt encryption of db fields as on my server if someone has access to the db files they will also have access to my python sourcecode.

Is there a best-practice method of securing the key used? Or an alternative method of encrypting the db fields (at application not db level)?

UPDATE: the fields I am trying to secure are oauth tokens.

UPDATE: I guess there is no common way to avoid this. I think I'll need to encrypt the fields anyway as it's likely the db files will get backed up and moved around so at least I'll reduce the issue to a single vulnerable location - viewing my source code.

UPDATE: The oauth tokens need to be used for api calls while the user is offline, therefore using their password as a key is not suitable in this case.

4

3 回答 3

5

如果您正在加密只需要验证(不回忆)的字段,那么使用 SHA 进行简单散列或使用 DES 进行单向加密,或者使用盐来防止彩虹表实际显示它们的 IDEA。这对于密码或其他访问机密很有用。

Python 和 webapps 让我想到了 GAE,所以你可能想要一些不对每个数据库事务进行加密/解密的东西,因为这些在 GAE 上已经不便宜了。

加密数据库的最佳实践是使用用户自己的密钥对字段进行加密,但要包含一个非对称后门来加密用户密钥,以便您(而不是任何有权访问数据库源文件或表的人)可以解密用户密钥与您的密钥,应恢复或其他必要的。

在这种情况下,用户(或您或受信任的代表)只能收回和解密他们自己的信息。如果您认为需要通过加密保护其字段,您可能希望在验证用户机密时更加严格。

在这方面,一些秘密词的密码(而不是密码)如“in the Jungle the strong Jungle”是一种鼓励的好习惯。

编辑:刚刚看到你的更新。存储 OAuth 的最佳方式是给它们一个较短的生命周期,只请求您需要的资源并重新请求它们而不是获得长令牌。最好围绕获得身份验证、获得访问权限和退出进行设计,而不是将密钥放在后门下 10 年。

因为,如果您需要在用户上线时调用 OAuth,您可以按照上述操作并使用用户特定的密码进行加密。您还可以从加密计数器(使用用户密码加密)中生成密钥,以便实际加密密钥在每次交易中发生变化,并且计数器以明文形式存储。但在使用前请检查此模式的特定加密算法讨论。一些算法可能无法很好地解决这个问题。

于 2012-02-08T17:54:05.127 回答
1

正如您所注意到的,对称加密确实没用;但是对于某些领域,使用非对称加密或陷门函数可能是可用的:

  • 如果 Web 应用程序不需要回读数据,则使用非对称加密。这对于例如信用卡数据很有用:您的应用程序将使用订单处理系统的公钥加密数据,该系统位于不可公开访问的单独机器上。

  • 如果您只需要相等比较,请使用陷门函数,例如消息摘要,最好使用盐值。这对于在服务器上应该无法恢复的密码很有用。

于 2012-02-08T17:46:13.920 回答
0

在您确定哪种加密方法是最好的之前,您必须考虑您要保护的内容以及攻击者准备投入多少精力从您的系统中获取密钥/信息。

您试图通过使用加密来补救的攻击场景是什么?被盗的数据库文件?

于 2012-02-08T17:47:34.133 回答