在您描述的情况下,您代表用户存储信息,并且您没有使用它来验证用户。因此,虽然您存储的内容包括密码(几乎完全是),但您并不是传统意义上的真正“存储密码”。您正在存储秘密。
相应地调整你的策略。
这两个问题都解决了;你只需要应用正确的解决方案。当“存储密码”(即验证用户)时,您会经历您熟悉的散列、盐、密钥拉伸等。但是存储秘密呢。
首先,如果可能的话,你会避免这个问题。这就是存在 API 访问令牌等概念的原因。你不需要我的 Facebook 密码,因为你不能使用它。你需要一个访问令牌,Facebook 愿意在我的许可下给你。
下一个最佳解决方案是将访问权限与用户登录绑定。信息使用从您用于登录的密码派生的密钥加密 - 我不知道也不存储。因此,除非您输入密码,否则我(服务器所有者)无法访问您的数据。
这很受欢迎,因为它很强大。事实上,Windows 已经这样做了很长时间,这就是为什么更改密码会导致加密文件无法访问的原因。这也是为什么您的 Windows 密码在您登录时以纯文本形式存储在内存中的原因。我建议您避免这种实施混乱。
接下来在我们的列表中,您可以分离您的进程,以使未加密的数据永远不会在面向外部的机器上可用。如果涉及 HSM,则可获得奖励积分。这里的要点是用户将他的秘密提供给网络服务器,这些秘密使用公钥快速加密到某个秘密加密设备,该设备完全无法访问,因为它没有连接。简单的秘密会立即被遗忘,然后加密的数据会被运送到某个地方的某个冷藏库。
最终,这些秘密在加密货币的帮助下在其他地方被解密并被使用。只是,发生这种情况的地方没有互联网访问权限。或者至少没有从外到内的路径。
最后,您可以尝试上面的解决方案,但失败得很惨。我只提到这一点是因为实际上所有其他解决方案都只是上述解决方案的糟糕变体:在数据库中加密,使用应用程序密码,将密码存储在另一台服务器上,将数据存储在另一台服务器上,用 [愚蠢的想法加盐你的加密密钥这里],等等。
最后,我对此类问题的标准警告适用。我会写得非常大:
你问这个问题的事实意味着你不应该这样做
严重地。存储人民银行凭证?如果您不明白自己遇到了什么样的麻烦,如果您在互联网上寻求有关如何做到这一点的建议,如果我提到的所有解决方案都不是您最关心的作为唯一可行的选择,那么您不应该实施 this。
人们相信你能做到这一点。 你不会正确地做到这一点。不是因为你没有问正确的问题,而是因为你没有经常解决这个问题,以了解你会忽略哪些隐藏的陷阱。这是困难的事情:不难做,但很难不犯错误。
不要让自己不知所措,从而背叛客户的信任。