软件可以在本地以纯文本形式存储密码吗?

信息安全 密码 密码管理 密码策略 贮存 安全编码
2021-08-26 08:01:40

当网站存储纯文本密码时,已经存在很多问题但是这个有点不同。

我使用一个开源(见下文)软件来玩游戏。它需要一个不直接链接到任何服务的用户帐户。登录包括在对话框中输入用户名和密码,但该对话框还提供“保存密码”选项。

此选项使用专为在跨平台应用程序中存储设置而设计的 API 保存密码。但由于它旨在保存可以在应用程序之外更改的非机密设置,因此它以纯文本格式保存数据。它在不需要任何特殊访问权限的位置执行此操作。例如,在 Windows 上,API 将设置存储在注册表中(即使是非管理员也至少具有只读访问权限的位置)。

API 以纯文本形式传递密码,从而存储纯文本密码。这意味着我现在可以在我的机器上从非提升提示符运行一个简单的命令,并获取我最后使用的纯文本密码。

此外,我计算机上的任何软件都可以轻松访问此信息。我最近写了一个小程序来更新软件使用的某些文件。但是,我开始收到抱怨,即使它找到了文件,程序也无法编辑它们。事实证明,用户并没有以管理员身份运行该程序。但这意味着即使我的程序不允许访问程序的游戏文件,它也可以读取包含纯文本密码的相同注册表项,即使 Windows 的安全性已将其作为下载程序阻止也是如此。

我之前提出过这个问题,但尽管我尽了最大努力,但似乎没有人认为这是一个严重的问题(见下文)。

问题:我是在“无所事事”,还是在本地以纯文本形式存储密码就像我认为在任何地方以纯文本形式存储密码一样严重?

注意:它是开源的确实意味着我可以“修复”这个问题,但是有一些问题:

  • 它是完全跨平台的(并且没有使用特定于平台的代码)。我知道可以以相对安全的方式存储密码的大多数系统都高度依赖于平台(如 DPAPI)

  • 主要的开发团队非常小,似乎没有一个人了解保护密码的相关性。我之前提出过这个话题,我得到的回应使 PR 不太可能得到任何结果。据我所知,唯一一个使用该软件运行服务器的人将其视为“为争论而争论”。他的回应是:

“我不知道我是否同意责任落在工具身上,这就像说我们不应该制造枪支,因为它们可能会被以不好的方式使用,这取决于使用工具的人来承担责任”。 ..“如果有人愚蠢到将银行帐户密码放入[程序],也许他们应该考虑对安全性进行一些研究”。

然后我回忆起看到一些关于加密存储的密码,所以我试图说服他,一些相同的推理要求数据库应该加密应用于本地存储密码的密码。但他不同意(似乎密码被加密的事实有点像货物崇拜编程):

“数据库是可公开访问的[我不明白为什么它应该是另一个问题],那完全不同。你的机器不应该坐在外面让人们访问”......“再一次,如果你机器在没有保护的世界上晃来晃去,别哭了”

  • 普通用户似乎也不了解相关性,因此分叉存储库并提供修复不会做任何事情。由于该软件是一款没有排名或货币化的免费游戏,他们不明白为什么我会如此担心有人发现我的密码(或者他们为什么应该这样做)。知识渊博人只是不理会它,说如果他们的密码不是该帐户独有的,那是用户的错。

  • 我完全不同意应该有“保存密码”功能。众所周知,在本地存储密码很难正确完成(即使像 DPAPI 这样的系统也远非完美)。很少觉得提供这些功能是值得的。我尤其看不出这样的程序有什么意义。

3个回答

简短的回答是,存储纯文本密码永远不会好,这样做是一种不好的做法。根据您的描述,与支持该应用程序的组织相关的风险有限,因为不存在合规性或直接的金钱风险。这种风险会转嫁给用户。该软件的用户可能会泄露他们的密码。如果公关失败,这会给组织带来风险。这可以用来证明修复它的成本是合理的。

任何软件的用户都会期望软件对其密码采取足够的预防措施。大多数用户不会考虑保存密码。他们会假设它已安全保存,软件不会以纯文本形式警告他们,并且大多数用户会重复使用密码。是的,这对他们来说是一种不好的做法,但将其保存为纯文本只会让事情变得更糟。'sheeple 应该被黑' 的论点是错误的。家庭无线路由器现在默认为其最强的安全性是有原因的。这样做是为了保护那些不知道如何打开它的人。没有人是所有方面的专家,也不是每个人都会了解安全的基础知识。作为安全专家,我们的部分职责是提防那些没有足够知识来保护自己的人。

我认为你有一个艰苦的战斗来解决这个问题。我认为以纯文本形式保存密码违反了用户的信任。我上面提到的风险是存在的。但是,以您已经看到的态度,他们可能会反击,而您继续反击这种文化可能对您来说不值得。尽管我认为这是正确的做法。我知道这让我在以前的工作中升职/加薪时不受欢迎,但我还是这样做了。用户希望您对他们的密码采取预防措施。如果事实证明您不这样做,您可能无法恢复这种信任。

我个人不同意存储纯文本密码总是不好的,因为它取决于存储密码的应用程序或目的。一般来说,是的,出于所有显而易见的原因,以纯文本形式存储密码是一个糟糕的安全选择。然而,这并不意味着它在所有情况下都是一个非常糟糕的选择。

如果密码没有公开传输(通过互联网,甚至是本地网络),则存储在本地程序文件中以进行身份​​验证,并且没有任何值得保护的东西,谁在乎您是否将密码存储为明文-文本?这就像使用密码保护您对 notepad.exe 的访问一样。唯一的风险是最终用户将选择一个用户名和密码,用于其他风险较高的现有应用程序。如果这些信息不是由于您自己的过错而受到损害,那么您的最终用户可能会受到一些伤害。

哎呀,甚至有一些应用程序,(也许教某人如何破解编写不佳的应用程序!=D),您可能会故意选择存储纯文本密码。

风险非常小,甚至可能不值得担心。不像您在这里存储访问一个国家的核武库发射代码的密码。但是有一些风险,即使它很小,采取简单的步骤来保护你的用户只是一件好事。

在这个不完美的世界中,整个“独特和随机”具有双重目的,在这个世界中,网站既不能做正确的事,也不能有良好的意图。

该网站可以将用户名密码组合出售给破解者进行研究并纳入高级字典攻击。又名故意伤害。提供免费游戏,要求注册,看看有多少傻瓜使用与他们的 facebook 或 google 帐户相同的凭据。

当然,只有那些对安全一无所知并将它们以明文形式存储的假人。

无论哪种方式都不好,作为用户的您应该假设该网站不可信并使用唯一且随机的密码。

如果您是制作愚蠢的互联网游戏的开发者,请考虑您的用户很可能不知道良好的安全实践,并最终为您的游戏使用与他们的银行帐户相同的凭据,并且如果您的互联网游戏被黑客入侵并且密码表被盗,那么您可能会无意中对您的客户造成很大伤害。

所以是的,我说无论您是开发人员还是用户,认真对待安全始终很重要。而且,如果您认真对待安全性,那么以明文形式存储密码是不可能的,不加盐或其他过时的不良做法也是不可接受的。

在您的特定情况下,您可能希望根据只有您的软件用户知道的密码而不是散列密码来加密密码,因为听起来您的应用程序就像密码管理器一样。有一些库可以根据您使用的技术轻松实现。。网?