0

我正在尝试实现具有以下要求的安全系统:

  • 所有客户端共享一个密码,服务器知道该密码
  • 每个客户端都有一个唯一的客户端 ID,服务器知道该ID
  • 所有知道密码的客户端都必须能够在服务器上生成相同的共享密钥(这个秘密可以是任何东西,它只需要对所有客户端都相同,并且在密码中是唯一的)
  • 即使服务器或传输被黑客入侵,密码也需要保持安全
  • 具有不同 client-id 的另一方必须不可能在不知道密码的情况下生成相同的服务器端机密

让我试着给出一个图形表示:

            Client                         Server
.--------------^-----------.       .----------^----------.

          f(client-id 1)              g(client-id 1)
PASSWORD ----------------> request 1 ----------------> KEY
   || equal                                             || equal
PASSWORD ----------------> request 2 ----------------> KEY
          f(client-id 2)              g(client-id 2)

这里,f() [g()] 是客户端 [server] 应用到密码 [re​​quest] 以获取请求 [key] 的函数。这些功能可能取决于客户端 ID。

我想出了两种方法可以做到这一点,但我希望有一些更简单的方法,需要更少的流量和更少的服务器负载:

  1. “不费吹灰之力”:客户端散列密码。客户端和服务器各自使用标准机制(如 SSL)来保护它们的连接并通过此连接发送散列。

  2. “更聪明一点”:服务器有一个固定的私钥编码,每个客户端都有一个公钥编码。客户端对密码进行哈希处理,将其与客户端 ID 进行异或运算,并使用公钥使用 RSA/PGP 对结果进行加密。然后,服务器使用私钥对请求进行解密,并将结果与​​ client-id 进行异或,以得到密码哈希。

在这两种情况下,服务器最终都会为客户端提供相同的秘密:密码哈希。第二个版本的优点是不需要完整的密钥交换和加密系统的开销,因为不幸的是我不能在所有情况下都依赖 SSL。事实上,它允许我在一个请求中生成服务器密码,而无需任何握手。第二个版本中的 client-id-XOR 用于防止重放攻击,在这种情况下,具有不同 client-id 的第三方可以简单地将相同的加密消息发送到服务器以生成相同的秘密。基本上,这是一种添加盐的无开销方式。

现在的问题:

由于我对服务器端秘密没有任何要求,甚至客户端可以在本地生成这个秘密,有没有一种更简单的方法来做到这一点,它不需要对任意精度数字进行昂贵的模幂运算,例如RSA呢?我正在考虑上面的 f() 和 g() 的某种其他陷门函数,它可以让我获得相同的结果。

4

1 回答 1

0

没有接受者,我猜......这个问题可能太模糊了......

无论如何:现在我决定使用 RSA(即上面的方法 2)。它的实现很简单,并且使用正确的库,运行起来也不会太昂贵。

于 2012-11-05T16:13:06.630 回答