我正在开发一个Node.js应用程序,它要求用户从第三方服务输入他的API密钥(该服务不允许通过oauth登录)。现在,我将它们存储在一个.env文件中,因此需要在安装时输入它。我希望te用户能够在用户界面中设置一次密钥(使用密码),然后永久存储它们,以便当退出应用程序并重新启动时,密钥仍在那里。我该怎么做呢?我要加密密钥并将它们存储在数据库中吗?还有其他方法吗?
发布于 2021-12-03 21:20:14
一般来说,对于您的用户和作为服务提供商的您来说,这都是太大的风险。如果这些是您想要存储的有价值的api密钥,那么您的服务就成为一个很好的目标。正如您还注意到的,这就是oauth诞生的目的。
如果你仍然决定这样做,你可以用一些ux来换取更多的安全性。您绝对应该加密api密钥,但是在哪里存储加密密钥以使其真正有意义始终是一个问题。
想一想攻击者如何获得这些api密钥(威胁),这将有助于提出足够的保护措施(缓解这些威胁)。
例如,攻击者可能直接或脱机访问数据库,如从备份或通过受损的数据库服务器。为此,dbms提供的标准静态加密是很好的,特别是当您使用AWS和KMS之类的东西来存储加密密钥时。所以你需要静态加密,但这还不够。
攻击者可能也会破坏你的应用程序,所以透明加密没有帮助。例如,您可以加密您的敏感字段(即,api密钥),具有与每个用户相关联的唯一密钥,安全地存储在适当的服务中(如HSM或AWS中的Secrets Manager )。这可能仍然允许攻击者访问,但这变得越来越困难,并且您可以获得更多的控制和对密钥访问的审计。
更进一步,您可以使用适当的密钥派生函数(如pbkdf2或类似函数)从您的用户密码派生密钥,而不是将它们存储在数据库中,而只存储在内存中。这意味着,如果登录的用户有权访问服务器内存和/或服务器端的网络通信(在tls终止后),他们的秘密仍可能被攻击者泄露,但离线用户的秘密仍然是安全的,因为即使您没有解密它们的密钥。当然,这只在你只需要访问他们的api密钥的情况下有效,只要它们存在。
https://stackoverflow.com/questions/70218340
复制相似问题