【问题标题】:restful WCF service authenticationRESTful WCF 服务认证
【发布时间】:2012-05-10 10:06:46
【问题描述】:

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

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

  1. 用户 ID

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

  3. AppId

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

问题-

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

  2. 有没有更好的办法

【问题讨论】:

  • Re #1,您可以保存旧密钥,直到使用它的最后一个会话过期 - 这意味着该密钥最多可以保留 4 小时。
  • 你的意思是“现在因为这将高度依赖于私钥(这将是相同的,因此系统内的某个人可以泄露它并滥用它)”

标签: c# wcf rest authentication pki


【解决方案1】:

有更好的方法吗?

是的,它被称为 SSL/HTTPS。如果您已经在使用 HTTPS,则不需要任何这种加密魔法。如果您不使用 HTTPS,那么您在设计上就已经不安全了,您想出的任何办法都无法解决重新发明 SSL 的问题。

那么如果传输是安全的(HTTPS)你应该怎么做

  1. 客户端以明文形式发送用户名+密码进行身份验证请求。
  2. 服务器根据与帐户一起存储的(希望)散列密码验证用户名 + 密码对。
  3. 服务器使用静态 AES 密钥以令牌(加密的帐户 ID、到期时间等)进行响应。
  4. 客户端将令牌用于所有经过身份验证的请求。

简单。

你可以做的一件事……

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

我怎样才能使它更安全?

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

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

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

--或--

为了防止这种情况发生,您可以使用一些盐 + 密码散列来代替明文形式的密码发送到服务器。我作为一个中间人可以简单地给你一个固定的盐值,然后为这个盐值预先计算一个完整的彩虹表。现在,我再次以明文形式获得了每个人的密码(大多数情况下)。

--或--

为了防止这种情况发生,您使用 PKI 建立一些秘密会话密钥,然后对每个通信进行签名和加密。嗯,哎呀...听起来很熟悉...见SSL on Wikipedia。意识到使 SSL 安全的唯一 事情是保护它的私钥。一旦私钥丢失,所有的安全和信任都将丢失。

最后说明:

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

您还应该意识到,在 SSL(如 OpenSSL)的软件实现上花费了数千个工时,并且他们不断地在其实现中发现漏洞。您自己实现它并像 IIS 或 OpenSSL 一样安全的希望几乎是零。那不是你的Digg,那只是现实,我也做不到我只知道甚至不尝试。

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

一些有用的链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2013-12-03
    • 2011-01-02
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多