您可能会考虑部署自己的 SSO 环境(请注意,我没有说“自己动手”)。
我个人贡献的一个是 Jasig 的中央身份验证服务 ( http://www.jasig.org/cas ),它作为一个集中的身份验证平台,供您的用户登录。然后,您的“客户端”应用程序需要与 CAS 进行“CAS 化”(集成),以便在用户已经通过此第三方软件验证的情况下授权用户访问。
关于您的问题,我贡献的组件是他们的 ClearPass 扩展(此处),它虽然增加了任何使用哈希加密的应用程序的安全风险,但允许您代理明文凭据(此处)。
目的(ClearPass):要启用单点登录到某些遗留应用程序,可能需要向它们提供实际的明文密码。虽然这种方法不可避免地增加了安全风险,但许多机构发现它是“必要的邪恶”。
成功完成 ClearPass 交易后,您将获得用户的登录名和密码。请注意,这将是用户的应用程序登录凭据;用户使用什么来登录您的应用程序,该应用程序代表他们处理对第三方电子邮件服务的身份验证。
手头的登录凭据,然后您可以通过 ClearPass 一遍又一遍地重新请求他们的应用程序密码,以按需解密您最初使用他们的登录密码加密的服务密码,以解决@executifs 描述的“密码管理器”问题。用户应用程序密码的存储由 ClearPass 处理,由 EncryptedMapDecorator 加密,并存储在内存中(或 memcached 等)。
顺便说一句,这是我不久前在使用加密和 ClearPass 时写的关于加密实现的快速wiki 页面(是的,它已提交给 Freenode 上的##crypto 以进行大众批评并根据需要进行修改) 以防万一。
对于实际代码,这里有一些Java、Node.js 中的示例。,是的,甚至C#。请注意,最后两个基本上是我对EncryptedMapDecorator.java基于密码的密钥派生(根据您的密码短语派生密钥)、初始化向量(安全随机字节)甚至打包的端口。在研究了我在这里汇总的资源以及这些代码示例之后,您应该有足够的知识能够将其移植到 PHP,或者至少可以开始使用 :)
希望有些帮助!