存储需要重复使用的密码的最佳做法?

End*_*All 6 c# mysql security encryption hash

我们有一个自动化平台,需要在数据库中存储服务帐户密码.

这些密码用于各种不同的情况,但通常需要反转为原始的纯文本形式才能起作用.

服务帐户都被划分为非常具体的东西 - 但是,我很不舒服地将它们以纯文本形式留在数据库中.

当密码需要可逆时,将密码存储在数据库中的最佳方法/技术是什么?

对于具体建议,该平台使用C#,. Net MVC和MySQL(MariaDB).

我的直接计划是在使用应用程序服务器上的本地密钥库中保存的不可导出的私钥对其进行签名后存储它们.然后在从数据库中读取加密方法时将其反转.

如果这是我应该使用的技术,我应该注意哪些特定的方法?

感谢您提供任何帮助或信息.

[编辑重新打开并删除"基于意见"分类.微软为这个确切的用例提供了特定的文档.我不能添加答案或标记作为答案,直到它,但我的解决方案如下:]

Microsoft工程团队的建议是使用Machine Key类和方法.

利用通过IIS生成的机器密钥集和提供给Protect方法的唯一生成的"目的"字符串,我可以安全地加密和解密列,并在静止时保持其安全.

在MariaDB(MySQL)中,您需要使用tinyblob列来存储字节数组.

我不相信这是一个基于意见的答案,因为这是使用问题中指定的技术来实现它的事实方法.

IIS机器密钥

Luk*_*ark 2

通常,要代表用户与其他服务提供商执行活动,您可以使用 OAuth2 等方案。

在这种情况下,我认为这是不可用或不提供的。

与散列密码相比,加密密码的问题在于加密是一种双向功能,可以逆转,这本身就是一个安全问题,因为任何拥有密钥的人都可以解密密码。那么问题就变成了如何保证密钥的安全

答案很简单:不要将密钥保存在系统上的任何位置。

使用您自己的用户密码来派生加密密钥,然后使用它来加密您存储的用于其他服务的其他密码。当您需要这些密码时,用户必须提供其“主”密码才能授权操作

这样做的好处是,如果您的数据库遭到破坏,则无法恢复任何密码。此外,如果您的前端服务器遭到破坏,唯一的攻击途径就是修改行为并等待用户尝试登录。

从更技术的角度来看,请执行以下操作:

  • 当用户创建您的帐户时,从他们的密码中派生密钥(PBKDF2 是一个不错的选择)。我们就这样称呼吧k1

  • 随机生成另一个对称密钥,我们称之为k2

  • 使用 加密其他服务的所有外部密码k2,每次都可以通过k1再次派生然后解密来获取该密码。

  • 如果用户想要更改其帐户密码,只需k2使用旧密码解密k1,从新密码中派生出新密钥,然后k2使用新密钥再次加密即可。

您确实应该避免以可逆的形式存储用户密码。但如果你绝对必须这样做,上述方法是一个很好的方法,可以保证事情相对安全。

  • 只要用户可以对每次使用的密码进行身份验证,这就是一个很好的方案。问题是,可能需要在用户不在的情况下使用。在这种情况下,需要对密码进行加密,并使用 HSM 或在 Internet 上不可用的服务器上保存加密密钥、速率限制和警报,并在 HSM/服务器上完成加密/解密。 (3认同)