服务器端共享密钥生成的安全协议

时间:2012-10-18 16:16:42

标签: security rsa pgp shared-secret

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

  • 所有客户共享密码,服务器
  • 每个客户都有一个唯一客户端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()]是客户端[服务器]应用于密码[请求]以获取请求[密钥]的函数。这些功能可能取决于客户端ID。

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

  1. “No-brainer”:客户端散列密码。客户端和服务器均使用标准机制(如SSL)来保护其连接并通过此连接发送哈希值。

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

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

    现在的问题是:

    由于我对服务器端的秘密没有任何要求,甚至客户端都无法在本地生成此秘密,是否有更简单的方法来执行此操作需要像RSA那样的任意精度数的昂贵的模幂运算吗?我正在考虑上面的f()和g()的某种其他陷门函数,它允许我实现相同的结果。

1 个答案:

答案 0 :(得分:0)

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

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