【问题标题】:How to store passwords safely to use later如何安全地存储密码以备后用
【发布时间】:2018-12-31 04:43:29
【问题描述】:

我有一个 Web 服务,我必须在其中保存用户密码,以便以后可以与其他网站交互,我需要最安全的方式来存储此密码,并且在需要时仍然能够恢复其原始形式。 我知道,因为我需要恢复其原始形式,所以没有太多选择,但我需要最好的。

我真的需要原始状态的密码,因为我的网络服务后来访问了一个不属于我的网站,我必须输入原始密码

【问题讨论】:

标签: mysql password-protection


【解决方案1】:

如果我正确理解您的问题,那么您只有一对或几对用户/密码要保存为 Web 服务配置的一部分。

根据我在多个项目中的经验,其中一些是针对真正关心安全性的机构客户,从开发人员的角度来看,解决方案很简单:

  • 将配置文件中的密码保存为开放文本

现在您可能会问:“安全性到底在哪里?”软件开发人员的答案是“不关你的事”。这将是在生产服务器上设置应用程序的系统管理员的业务。该管理员将确保:

  • 该文件包含连接到可能包含敏感数据的生产系统所需的正确用户/密码
  • 该文件只能在本地访问,并且只能由运行 Web 服务的用户访问
  • 文件保存在加密磁盘上,因此如果其他人拔下磁盘并将其连接到不同的系统,将无法读取该文件

(好吧,我从来没有做过这样的管理员,所以我可能遗漏了一些东西......)

在我工作的特定项目中设置配置文件的示例:

  • 在 SVN 中有一个 config.properties 包含用于测试环境的用户/密码,该测试环境不包含任何敏感数据,因此我们不在乎存储库的任何用户都可以读取这些密码
  • 在加载config.properties 之前,系统会查看是否存在名为config.properties.local 的文件并加载该文件而不是config.properties(如果存在)。此本地文件被 SVN 忽略且未提交。
  • 因此,使用此config.properties.local,开发人员可以在开发环境中使用其值覆盖config.properties 中的用户/密码,并且部署应用程序的管理员使用此config.properties.local 提供生产用户的方式相同/passwords 并如上所述确保文件的安全性。

编辑:事实上,最终我建议将其保存到受适当访问权限和文件系统加密保护的纯文本文件中。

虽然这仍然是我在安装应用程序时经常看到的常见解决方案,但您可能应该尝试为此目的使用操作系统内置的支持。

例如,在我使用的 Ubuntu 中,有 Gnome Keyring。一种密码管理器,可以安全地存储加密密码并在应用程序再次需要时对其进行解密。用户登录时自动解锁,使用方便。 GUI 称为 Seahorse(预装在 Ubuntu 中)。对于 CLI,安装 apt package libsecret-tools(实用工具 secret-tool)或搜索您的编程语言的 API。

【讨论】:

  • 我同意你的观点+1。我会注意到,一般来说,以可逆方式存储密码是不好的做法,假设它们不需要用作明文。如果这必须完成,那么你的建议是有价值的
【解决方案2】:

没有万无一失的方法来解决这个问题,客户端最终需要访问服务器,因此攻击者可以对客户端具有足够的权限。您所描述的是 OAuth2 协议的典型场景,但我从您的 cmets 得知,这不是一个选项。

  1. 如果您自己的服务需要自行登录,那么您可以 从用户密码中派生出一个密钥,用于加密外来的 密码。然后可以将此密钥保存在会话中,以供以后使用。
  2. 即使用户没有登录到您的服务,您也可以请求 密码只是为了解密外国密码。
  3. 另一种选择是,在您的网络服务启动时要求输入密码。只要服务运行,它就可以保存在内存中,因此您不必将外部密码存储在数据库中。

【讨论】:

    【解决方案3】:

    不要使用盐,使用 PHP 的一些技术,password_hash()

    【讨论】:

    • 虽然散列通常是要走的路,但在这种情况下它不起作用,因为稍后需要原始密码才能登录另一个网站。
    • 任何 API 的作用,或身份验证的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2016-04-01
    • 2010-12-07
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多