我们有一个自动化平台,需要在数据库中存储服务帐户密码。
这些密码用于各种不同的情况,但通常需要反转为原始的纯文本格式才能生效。
服务帐户都被划分为非常具体的东西 - 但是,我很不舒服地将它们以明文形式留在数据库中。
当数据库需要可逆时,将密码存储在数据库中的最佳方法/技术是什么?
对于具体建议,该平台使用 C#,. Net MVC 和MySQL(MariaDB)。
我的直接计划是在使用应用程序服务器上的本地密钥存储区中保存的不可导出的私钥对其进行签名后存储它们。然后在从数据库中读取加密方法时将其反转。
如果这是我应该使用的技术,我应该注意哪些特殊方法?
感谢您提供任何帮助或信息。
[已编辑重新打开并删除“基于意见”分类。微软为这个确切的用例提供了特定的文档。我无法添加答案或标记作为答案,直到答案为止,但我的解决方案如下:]
Microsoft工程团队的建议是使用Machine Key class and methods。
利用机器密钥集并通过IIS生成并提供给Protect方法的唯一生成的“目的”字符串,我可以安全地加密和解密列,并在静止时保持安全。
在MariaDB(MySQL)中,你需要使用一串tinyblob来存储字节数组。
我不相信这是基于意见的答案,因为这是使用问题中指定的技术来实现它的事实方法。
答案 0 :(得分:2)
通常,要代表用户与其他服务提供商执行活动,您可以使用OAuth2等方案。
在这种情况下,我认为这是不可用的或提供的。
与散列密码相比,加密密码的问题是加密是双向功能,可以颠倒,这本身就是一个安全问题,因为任何拥有密钥的人都可以解密密码。然后问题变成如何保持密钥安全?
答案很简单:不要将密钥保留在系统的任何位置。
使用您自己的用户密码派生加密密钥,然后使用此密码加密您存储的其他密码以用于其他服务。当您需要这些密码时,用户必须提供“主”密码才能授权操作
这样做的好处是,如果您的数据库遭到入侵,则无法恢复任何密码。此外,如果您的前置服务器遭到入侵,唯一的攻击媒介将是修改行为并等待用户尝试登录。
从更技术的角度来看,请执行以下操作:
当用户为您创建帐户时,从密码中获取密钥(PBKDF2是一个不错的选择)。我们称之为k1
。
随机生成另一个对称密钥,我们称之为k2
。
使用k2
加密其他服务的所有外部密码,您可以通过再次导出k1
然后解密来获取该密码。
如果用户想要更改其帐户密码,只需使用旧k2
解密k1
,从新密码中获取新密钥,然后再次使用k2
进行加密新钥匙。
您应该避免以可逆的形式存储用户密码。但是,如果你绝对必须,以上是一种保持相对安全的好方法。