如何安全地存储加密密钥?

时间:2012-02-08 17:34:21

标签: python database web-applications cryptography pycrypto

我正在考虑使用像pycrypto这样的加密库来加密/解密我的python webapp数据库中的字段。但加密算法需要密钥。如果我的源代码中有一个未加密的密钥,那么在我的服务器上尝试加密db字段似乎很愚蠢,如果有人可以访问db文件,他们也可以访问我的python源代码。

是否有保护所用密钥的最佳实践方法?或者另一种加密db字段的方法(在应用程序而不是db级别)?

更新:我要保护的字段是oauth令牌。

更新:我想没有通用的方法来避免这种情况。我想我无论如何都需要加密字段,因为db文件可能会被备份和移动,所以至少我会将问题减少到一个易受攻击的位置 - 查看我的源代码。

更新:当用户离线时,需要将oauth令牌用于api调用,因此在这种情况下使用他们的密码作为密钥是不合适的。

3 个答案:

答案 0 :(得分:4)

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

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

加密数据库的最佳做法是使用用户自己的秘密加密字段,但要包含加密用户密钥的非对称后门,以便您(而不是任何有权访问数据库源文件或表的人) )可以使用您的密钥解密用户密钥,恢复或其他必要的东西。

在这种情况下,用户(或您或受信任的代理人)只能退出并解密他们自己的信息。如果您认为需要通过加密来保护其字段,则可能需要更严格地验证用户机密。

在这方面,一些秘密词的密码(而不是密码),例如“丛林中强大的丛林”,是一种鼓励的好习惯。

编辑:刚看到你的更新。存储OAuth的最佳方法是为他们提供短暂的生命周期,只需要所需的资源并重新请求他们获取长令牌。最好是设计一下进行身份验证,获取访问权限和离开,而不是将密钥留在后门10年。

因为,如果您需要在用户上线时调用OAuth,您可以执行上述操作并使用用户特定密码进行加密。您还可以从加密计数器(使用用户密钥加密)中键入密钥,以便实际加密密钥在每次事务处更改,并且计数器以明文形式存储。但在使用之前,请检查此模式的具体加密算法。有些算法可能不会很好用。

答案 1 :(得分:1)

正如您所注意到的那样,对称加密确实毫无用处;但是对于某些字段,使用非对称加密或陷门功能可能是可用的:

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

  • 如果您只需要进行相等比较,请使用陷门功能,例如消息摘要,理想情况下使用salt值。这适用于服务器上无法恢复的密码。

答案 2 :(得分:0)

在您确定最佳加密方法之前,您必须考虑您要保护的内容以及攻击者准备从您的系统获取密钥/信息所需的工作量。

您尝试使用加密来解决的攻击情形是什么?一个被盗的数据库文件?