我阅读了几篇关于隐私/安全的文章,但仍然无法清楚地了解确保攻击者无法访问用户私人信息的最佳实践。
对于存储仅用于验证真实性的密码或其他数据,我知道像 SHA-256 这样的散列算法是完美的候选者,因为密码本身不需要存储(甚至不知道)在服务器端。
但是在我的情况下,除了密码之外,我还允许用户存储服务器需要能够为后台工作解密的其他秘密,这些秘密将读取这些秘密以提供历史统计信息,而无需用户登录。这些“秘密”通常是外部服务的 api 密钥,如果落入坏人之手,可能会很危险。
一个可能的解决方案是使用用户会话或 cookie 来存储秘密,但除了受到 cookie 或会话劫持之外,它还需要用户登录才能工作,在我的情况下,我需要服务器能够在没有用户登录的情况下解密并将秘密用于后台任务。
因此,另一种解决方案是使用例如 AES-256 对数据库中的秘密进行加密,并将加密密码保留在数据库之外。如果攻击者能够访问数据库,他就无法解密用户机密。如果攻击者可以访问服务器的文件系统,他可以访问密码,但不能访问数据库……哦,等一下,为什么不能访问数据库?如果攻击者可以访问服务器的文件系统,包括配置,他也可以访问数据库,因为连接字符串也在文件系统的配置中。因此,如果攻击者可以访问文件系统,他就可以访问密码和数据库......
我想不出任何真正将密码短语与数据库分开的解决方案。我错过了什么吗?是否有任何真正的解决方案来保护用户机密,以便至少 2 个不同的系统(数据库/文件)必须被黑客入侵才能访问机密,知道服务器需要能够在没有用户帮助的情况下加密/解密机密?
我的项目将在云中运行,nodejs 作为 web 服务器,mongodb 作为数据库,在向公众开放之前,我想确保攻击者几乎不可能检索到用户的秘密,这似乎并不就是这样。
编辑:我实际上可以在启动 Web 服务器(在我的例子中为 nodejs)时在命令中传递它,而不是将密码短语存储在配置中。因此,它不是从平面配置文件中读取密码,而是从命令行中读取密码。这样做可以确保密码永远不会写入文件(假设我可以禁用 bash 历史记录)并且只在内存中,这更难破解不是吗?唯一的缺点是如果服务器出现故障我需要手动启动服务器,因为自动启动将在不知道密码的情况下启动(所以我需要自己启动它)。但它会起作用吗?这是一种已知和使用过的做法吗?