如何安全地存储加密密钥



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

是否有固定所用钥匙的最佳实践方法?或者加密数据库字段的另一种方法(在应用程序而非数据库级别)?

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

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

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

如果您正在加密只需要验证(不调用)的字段,则使用SHA进行简单哈希或使用DES进行单向加密,或者使用盐进行IDEA以防止彩虹表实际显示它们。这对于密码或其他访问机密非常有用。

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

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

在这种情况下,用户(或您或受信任的委托人)只能撤销和解密他们自己的信息。如果您认为需要通过加密来保护用户字段的安全,则可能需要更严格地验证用户机密。

在这方面,一些秘密单词的密码短语(而不是密码),如"在丛林中,强大的丛林",是一个很好的鼓励做法。

编辑:刚刚看到你的更新。存储OAuth的最佳方式是给它们一个较短的寿命,只请求所需的资源,并在获得长令牌时重新请求它们。与其把钥匙藏在后门下10年,不如围绕身份验证、访问和退出进行设计。

因为,如果您需要在用户联机时调用OAuth,您可以按照上面的步骤进行,并使用用户特定的密钥进行加密。您也可以从加密的计数器中生成密钥(使用用户机密加密),这样实际的加密密钥在每次交易中都会发生变化,计数器以明文形式存储。但在使用之前,请查看该模式的具体加密算法讨论。有些算法可能对此不太好。

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

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

  • 如果只需要相等性比较,请使用陷门函数,例如消息摘要,最好使用salt值。这对于在服务器上不可恢复的密码是很好的。

在确定哪种加密方法是最好的之前,您必须考虑您试图保护什么,以及攻击者将付出多少努力从您的系统中获取密钥/信息。

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

相关内容

  • 没有找到相关文章

最新更新