3

我希望得到有关我设计的身份验证系统的反馈。

要求是创建一个封闭的单点登录网络环境,一旦我们的一名员工访问我们的一个网络应用程序,他们就会被要求使用由我们的 LDAP 支持的凭据登录。登录后,他们会在设定的时间段或浏览器会话以及我们所有的 Web 应用程序中保留此登录信息。谷歌的网络资产如何与谷歌帐户一起工作,但对于我们的内部系统。

用户自己在 windows、mac 或 linux 上操作,有些只是在平板电脑上操作,所以这个身份验证环境需要完全在线存在,带有 mod_auth_kerb 等的 kerberos 不会削减它。

我们当前所有的 Web 应用程序都使用 PHP。

到目前为止,我拥有的系统如下所示。

存在一个中央身份验证系统,我将其称为身份验证处理程序,或简称为“处理程序”,以及一个或多个身份验证“客户端”Web 应用程序,我将其称为身份验证请求程序,或简称为“请求程序”。我将把用户和他们的浏览器称为“用户”。

此外,要使其正常工作,需要在处理程序中为请求者预先配置requestor_id该 ID 的唯一和返回 URL。为处理程序生成一个私钥,并将一个公钥预先提供给所有请求者。

用户访问请求者

  1. 用户输入请求者的 URL。
  2. 此用户在请求者上不存在会话,因此请求者SESSION_ID在 PHP 中创建一个新的(使用内置会话处理程序和session_start)。
  3. 会话没有身份验证,因此请求者将生成一个指向已配置处理程序的 URL,该处理程序由两部分组成,一个authrequest令牌和一个envelope.
    1. 请求者首先session_regenerate_id为客户端的此身份验证请求重新生成一个新的 session_id(在 PHP 中)。
    2. 然后请求者生成一个随机密码,在这种情况下使用 PHPopenssl_random_pseudo_bytes并将其存储在会话数据中
    3. 然后,请求者使用PHP using的随机密码对SESSION_IDusing进行加密。AES256authrequestopenssl_encrypt
    4. 然后,请求者通过连接它的唯一requestor_id性、':' 和 base64 编码的随机密码来生成信封数据。
    5. openssl_public_encrypt然后使用PHP中处理程序的预共享公钥加密请求者的信封数据。
  4. 请求者然后向location:用户发送一个标头,其中包含加密envelope的和authrequest作为 URL 参数的处理程序。
  5. 处理程序将使用它的私钥解密信封,并将 clientID 和密码分开。
  6. 处理程序将检查requestor_id我们是否配置了这个,如果没有,将通知用户请求者未被识别。
  7. 处理程序将对用户进行身份验证(在这种情况下,通过询问用户名和密码并检查 LDAP 和/或通过预身份验证会话)
  8. 然后处理程序将生成一个返回authtoken给请求者
    1. 处理程序将SESSION_ID使用authrequest信封中的解密和解码密码解密
    2. SESSION_ID处理程序将使用信封中的解密和解码密码加密包含登录凭据(用户名、GUID 等)的新字符串和 ID
  9. 然后,处理程序将location:包含authtokenas URL 参数的标头发送给用户,并将其发送到为此的预配置 URL requestor_id
  10. 请求者接收请求,并将使用用户会话中的密码解密令牌。
  11. 请求者将确认SESSION_ID与用户当前会话匹配,否则它将重新启动身份验证。
  12. 然后,请求者可以使用返回的 crednetialID 将本地用户标识为已通过身份验证。

这个过程可以在不同的系统中重复,以提供单点登录行为。

所以,问题:

  1. 有谁知道一个预先存在的、标准化的认证系统,它可以满足与上述类似的要求和预制件?
  2. 如果不是,并且鉴于我不是安全专家,是否有任何上述内容可能被破坏?即这种方法的弱点是什么?
4

2 回答 2

0

您在加密之前对密码的 base64 编码实际上没有任何意义(至少对我而言),因为它是一个主要用于序列化要在其他地方通信的数据的函数。但是,信封加密后,您又拥有二进制数据,因此您可能想要做的是序列化密文。

此外,您可能想检查是否可以在客户端对凭据进行哈希处理(1000 次迭代和加盐的 MD5 或 SHA-* 很好)。您可以查看RFC2617 (HTTP Digest Access Authentication) 以获得灵感。这是为了在服务器解密时对抗密码的漏洞。

于 2012-10-10T07:55:05.213 回答
0

您可以使用 Kerberos:http
://web.mit.edu/kerberos/www/ 或者您实现内部 OpenID 系统: http: //openid.net/
还有几个用于 OpenID 的 PHP 库:http://openid。网络/开发人员/库/

于 2012-10-10T07:18:58.397 回答