restful WCF服务认证

时间:2012-04-30 17:54:03

标签: c# wcf rest authentication pki

我有一个应用程序,它通过Jquery POST和其他应用程序(IPad,Android等)公开Web应用程序使用的服务。我必须创建一个高度安全但仍然足够快的身份验证系统。

我想过制作一个令牌,该令牌将在登录时传递给应用程序,并将用于特定时间(比如30分钟)的帖子,它应该刷新自己并且不会使会话到期。所以我想到一个令牌被发送到服务,并将生成令牌。它会接受

  1. 用户ID

  2. 密码(均使用公钥加密)

  3. 的AppId

  4. 服务器将通过私钥解密请求,并生成一个在特定时间内有效的令牌。现在,因为这将高度依赖于私钥(这将是相同的,因此系统内的某些人可以泄漏它并滥用它)所以我希望在特定时间(比如2小时)之后刷新私钥。

    问题 -

    1. 如何刷新私钥并确保不会拒绝当前发放的令牌。

    2. 有更好的方法吗

1 个答案:

答案 0 :(得分:5)

有更好的方法吗?

是的,它叫做SSL / HTTPS。如果您已经在使用HTTPS,那么就不需要任何这种加密魔法。如果您没有使用HTTPS,那么您的设计就已经不安全了,而您提出的任何内容都无法解决重新发明SSL的问题。

那么如果传输安全(HTTPS)

,您应该怎么做
  1. 客户端以明文形式发送用户名+密码的身份验证请求。
  2. 服务器根据与帐户一起存储的(希望)哈希密码验证用户名+密码对。
  3. 服务器使用静态AES密钥响应令牌(加密帐户ID,过期等)。
  4. 客户端将令牌用于所有经过身份验证的请求。
  5. 易。

    你可以做的一件事......

    为防止丢失在非安全设备上使用的凭据,您应该从Google和其他人那里获取一个页面。用户不必让用户输入他们的网站密码,而是让他们访问并登录您的网络服务器。从那里他们点击'为设备生成访问令牌'。生成唯一数据字符串(20个或更多字符)并使用其帐户进行记录。然后,用户可以从您的网站撤消此“备用密码”。

    如何让这更安全?

    你真的不能做得更好,这就是为什么......

    假设攻击者可以访问您的私钥。然后,攻击者可以在窃取用户名和密码的同时替换您的服务器或玩中间人。

    为了防止这种情况,你设法让一些PKI交换机发送由服务器给你的公钥加密的密码。我作为一个中间人可以简单地给你我自己的公钥并访问用户名和密码然后如果我选择,将它转发到真正的服务器。

    - 或 -

    要尝试阻止此操作,请使用一些salt +密码哈希值,该哈希值将以明文形式发送到服务器以代替密码。我作为一个中间人可以简单地给你一个固定的盐值,然后为这个盐值预先计算一个完整的彩虹表。现在我再次以明文形式提供每个人的密码(最好)。

    - 或 -

    要尝试阻止此操作,请使用PKI建立一些秘密会话密钥,然后对每个通信进行签名和加密。好吧,哎...听起来很熟悉......见SSL on Wikipedia。意识到使SSL安全的 ONLY 事物是对其私钥的保护。一旦私钥丢失,所有安全性和信任都将丢失。

    最终说明:

    如果无法保护某些加密密钥,则无法建立安全通信。

    您还应该意识到,在SSL的软件实现(如OpenSSL)上花费了数千个小时,并且他们经常在实现中发现漏洞。您希望自己实现这一点,并且像IIS或OpenSSL一样安全,几乎是无。这不是一个关于你的Digg,这只是现实,我无法做到,我只知道甚至不能尝试。

    最后,我的最后建议是关于你的陈述:“系统内的某个人可以泄露它并滥用它”。这是你真正的问题。解决这个问题,其他一切都会更容易。保护服务器环境应该是您的首要任务。您的第二个优先事项应该是在未能完成第一项工作后尽量减少对客户的影响。

    一些有用的链接: