我正在考虑使用诸如 pycrypto 之类的加密库来加密/解密我的 python webapp 数据库中的字段。但是加密算法需要 key 。如果我的源代码中有一个未加密的 key ,那么尝试像在我的服务器上那样加密 db 字段似乎很愚蠢,如果有人可以访问 db 文件,他们也可以访问我的 python 源代码。
是否有保护所用 key 的最佳实践方法?或者加密数据库字段的替代方法(在应用程序而非数据库级别)?
更新:我试图保护的字段是 oauth token 。
更新:我想没有避免这种情况的通用方法。我想无论如何我都需要加密这些字段,因为 db 文件很可能会得到备份并四处移动,所以至少我会将问题减少到一个易受攻击的位置 - 查看我的源代码。
更新:oauth token 需要在用户离线时用于 api 调用,因此在这种情况下不适合使用他们的密码作为 key 。
最佳答案
如果您正在加密您只需要验证(而不是召回)的字段,那么使用 SHA 的简单散列或使用 DES 的单向加密,或者 IDEA 使用盐来防止彩虹表实际泄露它们。这对于密码或其他访问 secret 很有用。
Python 和 webapps 让我想起了 GAE,所以您可能想要一些不对每个数据库事务进行加密/解密的东西,因为这些在 GAE 上已经不便宜了。
加密数据库的最佳实践是使用用户自己的 secret 加密字段,但包括一个加密用户 key 的非对称后门,这样您(而不是任何有权访问数据库源文件或表的人) ) 可以使用您的 secret key 解密用户 key ,如果恢复或其他需要的话。
在这种情况下,用户(或您或受信任的代表)只能退出和解密他们自己的信息。如果您认为需要通过加密来保护用户的字段,您可能希望在验证用户 secret 时更加严格。
在这方面,一些 secret 词的密码(而不是密码)是一种鼓励的好习惯,例如“in the jungle the mighty Jungle”。
编辑:刚看到您的更新。存储 OAuth 的最佳方式是给它们一个较短的生命周期,只请求您需要的资源,并在获得长 token 时重新请求它们。最好围绕获得身份验证、获得访问权限和退出进行设计,而不是将 key 留在后门下 10 年。
因为,如果您需要在用户上线时调用 OAuth,您可以按照上述操作并使用用户特定的 secret 进行加密。您还可以从加密计数器(使用用户密码加密)中生成 key ,这样实际的加密 key 在每次交易时都会发生变化,并且计数器以明文形式存储。但在使用前请检查此模式的特定加密算法讨论。一些算法可能不适合这个。
关于python - 如何安全地存储加密 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198494/