我很惊讶在这个网站上似乎没有一个规范的问题和答案,或者至少没有这个问题的副本——但是快速搜索未能找到任何相关的东西。
(这个问题没有独立于操作系统的答案——但我将讨论 Unix/Linux 的各种原因,现在不值得讨论)。
为了使用密码,您的应用程序必须能够以未加密的形式访问它。这意味着运行应用程序的用户帐户和 root 将有权访问明文。它很可能也会出现在系统的备份中,并且肯定会出现在 VM 快照中。
所以不可能完全确定密码不会被泄露。这意味着您(或其他相关系统管理员)应该采取措施来缓解这种情况。显而易见的是:
1)密码轮换这限制了捕获的密码对攻击者有用的窗口。在大多数情况下,要获得无缝更改,您需要在两个帐户之间交替使用 - 因此一个正在使用,而另一个正在更改。令人惊讶的是,很少有人会为此烦恼。
2)基于令牌的身份验证- 密码引导一次性令牌的更改(并立即被客户端忘记)。这种部署更为罕见。
3)机器身份的使用越来越受欢迎(由于服务在 clud 环境中的可用性)。为了避免将明文密码存储在计算机上(或等价的替代品,例如私钥),基础设施为客户端提供担保,例如通过提供可以代替密码呈现的签名证明。这通常需要客户端和服务器上的自定义软件来处理身份验证。
鉴于您当前的限制,那么这些不是非常实用的解决方案 - 您只有一个帐户,使用现成的软件并且无法控制您尝试验证的服务器。进一步的考虑是,使用 PHP,无论您选择何种机制来存储密码,您都需要较低的开销。虽然不理想,但我能想到的最实用的解决方案是:
4)使用Linux内核密钥存储(假设这是linux)。AFAIK,没有一个 PHP 扩展 - 所以你需要运行一个外部程序来每次检索密码。
5)将密码存储在内存驱动器上的文件中(具有适当的权限)。您可以改用共享内存,但与文件及其内容交互的工具更加有限。
6) 将密码存储在 webserver 运行时内存中,并在运行时将其作为环境变量传递给 PHP
7) 将密码存储在加密文件系统中——这里有很多选择,但encfs可能是最不痛苦且最容易与备份集成的。
请注意,前三个要求您提供一种在启动时注入凭据的方法(不确定如何为网络服务器执行此操作),而加密要求您在启动时提供解密密钥。