我必须在数据库中存储第三方凭据,最佳方法是什么?
我的应用需要从第三方读取一个SSL网址。我该如何在自己的数据库中存储这些第三方的凭证,以保护它们不被泄露呢?在考虑绝对安全和实用性的同时,我发现单向哈希凭证并没有用,因为我需要把凭证恢复成明文来进行SSL调用。我是在谷歌应用引擎上使用Python,并且我的应用是用谷歌的凭证进行身份验证的。
- 可以用比如AES这样的加密方式来加密凭证,并把加密密钥存放在别的地方(这只是把问题转移了),或者从凭证中推导出密钥并保密算法(这也只是转移了问题)。
- 使用同步流密码来加密凭证,从凭证中推导出(不)熵,并且保密算法(这同样只是转移了问题)。
- 在一个专门存储第三方凭证的独立网页应用上,提供一个SSL网址来接收第三方凭证,这个网址用谷歌凭证访问(和我的应用一样),可以使用authsub或其他方式将授权转移到另一个网页应用。这听起来更安全,因为一个简单的网页应用更难被黑客攻击,而且如果我的复杂主应用被攻破,第三方凭证就不会暴露。
你觉得这些方法怎么样?
4 个回答
如果你需要可逆地存储凭据(比如密码),那么其实没有什么好的解决办法。你可以使用AES加密技术,并且要把秘密钥匙放在有保安看守的地方。
如果你在使用Windows系统,我建议你看看Cred* Win32 API(也就是advapi32.dll),这个可以让你把钥匙管理的工作交给Windows的系统密钥,这样TPM(受信任的平台模块)或者开机密码就能帮助你防止一些低级别的安全问题,比如被盗的硬盘。
当然,如果你的应用程序或者它运行的安全环境被攻破,那么以上这些方法就没什么用了。
这些凭证是怎么被使用的呢?如果它们的使用只是在原始拥有者的操作下触发(比如说,你存储了一个银行卡号,而他们正在进行第二次购买),那么在这个时候,他们可以提供一个密码,这个密码就可以用作你的加密钥匙。这样一来,你就不需要在本地存储这个钥匙,数据库里的内容对攻击者来说就毫无用处了。
这是一项很难的任务,没有哪种方法能完全避免出现薄弱环节。首先,我不确定在谷歌上托管是否是最佳选择,因为这样你会失去一些控制权(我也不清楚App Engine是否具备所需的安全性,你需要自己去了解一下),而且可能无法进行渗透测试(这点你应该做)。
拥有一个单独的小应用程序可能是个好主意,但这并不能免除你在这个小应用中以某种方式加密凭据的必要性。这样做只是让事情变得简单一些,从而更容易进行分析。
我个人会尝试设计一个应用,让密钥在每次使用后随机变化,采用一种类似于一次性密码本的方法。你没有详细说明这个应用,所以我无法判断这样做是否可行。