2012-04-30 207 views
2

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

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

  1. 用户ID

  2. 密码(可以使用公共密钥加密)

  3. 的appid

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

问题 -

  1. 如何刷新私有密钥,并确保当前发出的令牌将不会被拒绝。

  2. 是否有这样做

+0

RE#1,你可以保存旧键,直到它正在使用已过期的最后一次会议 - 这意味着关键将在最多4个小时左右。 – Jeff

+0

你是什么意思“现在,因为这将高度依赖于私钥(这将是相同的,因此系统内的某人可能会泄漏它并滥用它)” –

回答

5

的更好的办法是这样做的更好的办法?

是的,它被称为SSL/HTTPS。如果您已经在使用HTTPS,那么就不需要任何这种加密魔法。如果你没有使用HTTPS,那么你的设计就已经不够安全,没有什么可以解决这个缺乏重新发明SSL的问题。

那么应该怎么做,如果运输安全(HTTPS)

  1. 客户端发出的认证以纯文本发送用户名+密码的请求。
  2. 服务器验证用户名和密码对与该帐户存储的(希望)散列密码对。
  3. 服务器使用静态AES密钥以令牌(加密帐户ID,到期等)响应。
  4. 客户端将令牌用于所有已认证的请求。

简单。

有一两件事你可以做...

为了防止非安全设备所使用的凭据丢失,你应该从谷歌和其他需要的页面。不要让用户输入他们的网站密码,让他们访问并登录到您的Web服务器。从那里他们点击'为设备生成访问令牌'。生成一个唯一的数据字符串(20个或更多个字符)并将其记录在其帐户中。这个'备用密码'然后可以被用户从你的网站撤销。

如何让这更安全?

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

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

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

- 或 -

为了试图阻止这种使用将在地方明文密码来向服务器发送一些盐+哈希密码。我作为一个中间人可以给你一个固定的盐值,然后为这个盐值预先计算一个完整的彩虹表。现在我再次以清晰的文字显示每个人的密码(最多)。

- 或 -

为了试图阻止这种使用PKI来建立一些秘密的会话密钥,然后签名和加密的每一次沟通。那么,呃......听起来很熟悉......见SSL on Wikipedia。要知道,使SSL安全的东西是保护它的私钥。一旦私钥丢失,所有的安全和信任都将丢失。

最后说明:

如果不能保护你不能建立安全通信的一些加密密钥。

您还应该知道,数千个工时已用于SSL的软件实现(如OpenSSL),并且他们经常在实现中发现漏洞。你自己实现这个目标的希望,并且像IIS或OpenSSL一样安全,几乎是NIL。这不是你的Digg,那只是现实,我无法做到,要么我只知道甚至没有尝试。

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

一些有用的链接: