跨应用程序用户身份验证

时间:2010-06-17 19:56:34

标签: security

我们有一个用.NET编写的webapp,它使用NTLM进行SSO。我们正在用Java编写一个新的webapp,它将与原始应用程序紧密集成。遗憾的是,Java不支持执行NTLM身份验证的服务器部分,而且我能找到的唯一库需要IT部门允许过多的设置。

为了解决这个问题,我想出了一个远程认证方案,可以跨应用程序工作,并希望你的意见。它不需要非常安全,但同时也不容易被打破。

  1. 用户使用NTLM
  2. 对.NET应用程序进行身份验证
  3. 用户单击离开.NET应用程序的链接
  4. .NET应用程序生成随机数并将其与用户的完整用户名(域\用户名)一起存储在用户表中
  5. 不安全令牌形成为随机数:用户名
  6. 使用存储在应用程序中的预共享密钥通过安全密码(可能是AES-256)运行不安全令牌以生成安全令牌
  7. 安全令牌作为查询字符串的一部分传递给Java应用程序
  8. Java应用程序使用存储在其自己的代码中的相同预共享密钥来解密安全密钥,以获取不安全的令牌
  9. 随机数和用户名分开
  10. 用户名用于从用户表中检索用户的信息,并根据从不安全令牌中提取的随机数检查存储的随机数
    • 如果数字匹配,则会将用户名放入用户的会话中,并且现在已对其进行身份验证
    • 如果数字不匹配,则会将用户重定向到.NET应用程序的主页
  11. 从数据库中删除随机数

1 个答案:

答案 0 :(得分:1)

1)将预共享密钥存储在文件(甚至是程序文件)中是影院而非安全。

2)您的令牌(数据库中的随机数)应设置为过期。我建议在一次尝试后过期,但也应设置时间限制。否则,你最终可能会得到数以千计的剩余令牌,这些令牌可以提供正确的猜测。

3)如果您只需要从Java工具验证是否允许访问,则可以使用公钥加密而不是预共享密钥。这样你只需要保护私钥。当然,保护包括:“不要将其放在您正在保护的用户可访问的文件中”,如果没有这种保护,这种方法与预共享密钥没有区别。

4)似乎我可以轻松修改java工具以忽略授权步骤,只执行您要保护的任何敏感任务。

把所有这些都用在盐中,因为我对Java和.NET知之甚少。我对密码学知之甚少。