C# restful WCF服务身份验证

C# restful WCF服务身份验证,c#,wcf,rest,authentication,pki,C#,Wcf,Rest,Authentication,Pki,我有一个应用程序,它公开了web应用程序通过jQueryPost和其他应用程序(IPad、Android等)使用的服务。我必须创建一个高度安全但仍然足够快的身份验证系统 我考虑制作一个令牌,登录时将其传递给应用程序,并在发布后的特定时间(比如30分钟)内使用该令牌,该令牌应自我刷新,并且不会使会话过期。所以我想制作一个发送到服务的令牌,它将生成令牌。它会接受的 用户ID 密码(均使用公钥加密) 阿皮德 服务器将通过私钥解密请求,并生成一个在特定时间内有效的令牌。现在,由于这在很大程度上取决于私钥

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

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

  • 用户ID

  • 密码(均使用公钥加密)

  • 阿皮德

  • 服务器将通过私钥解密请求,并生成一个在特定时间内有效的令牌。现在,由于这在很大程度上取决于私钥(私钥将是相同的,因此系统内的某个人可能会泄漏私钥并滥用私钥),因此我希望私钥在特定时间(比如2小时)后刷新

    问题-

  • 如何刷新私钥并确保当前颁发的令牌不会被拒绝

  • 有更好的方法吗


  • 有更好的方法吗?

    是的,它被称为SSL/HTTPS。如果您已经在使用HTTPS,那么就不需要任何这种加密魔法。如果您不使用HTTPS,那么从设计上来说,您已经不安全了,并且您提出的任何方案都无法弥补重新发明SSL的不足

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

  • 客户端请求以明文形式发送用户名+密码进行身份验证
  • 服务器根据存储在帐户中的(希望是)散列密码验证用户名+密码对
  • 服务器使用静态AES密钥以令牌(加密的帐户id、过期日期等)进行响应
  • 客户端将令牌用于所有经过身份验证的请求
  • 简单

    你可以做的一件事…

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

    我怎样才能使它更安全?

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

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

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

    --或--

    为了防止这种情况,您使用一些salt+密码散列来代替明文密码发送到服务器。作为中间人,我可以简单地给你一个盐的固定值,然后预先计算一个完整的彩虹表。现在我又一次把每个人的密码(好吧,大部分)都用明文写了出来

    --或--

    为了防止这种情况,您可以使用PKI建立一些秘密会话密钥,然后对每个通信进行签名和加密。哎呀。。。听起来很熟悉。。。看见要知道,使SSL安全的唯一办法是保护它的私钥。一旦私钥丢失,所有安全性和信任都将丢失

    最后注释:

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

    您还应该知道,在SSL(如OpenSSL)的软件实现上花费了数千个工时,他们经常在实现中发现漏洞。您希望自己实现它,并像IIS或OpenSSL一样安全地实现它,这几乎是零。这不是对你的挖苦,这只是现实,我也做不到,我知道的足够多,甚至不去尝试

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

    一些有用的链接:

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