如何为服务器计算快速的东西,但客户端计算速度慢?

时间:2011-03-23 18:15:50

标签: security cryptography

服务器需要几毫秒或更短的时间来计算,并让客户端几百毫秒?

服务器将创建挑战,将其发送到客户端,客户端将计算答案并将其发送到服务器,然后服务器将验证答案。

更新:为什么?服务器具有使用大量处理能力的功能。我不希望客户端能够通过向该功能每秒发送100个请求来恶意地使服务器过载。通过要求回答挑战,攻击者只能以尽可能快的速度发送请求。

2 个答案:

答案 0 :(得分:5)

首先让我说我认为你走的是错误的道路。

有了这样的说法,你所描述的一种方法就是将一个简单的谜题组合在一起,这个谜题是接收端强制执行的。例如,您可以发送3或4个字符密码的哈希值(合理地快速解决),客户端需要找出密码(通过暴力)并将其发回(如果您使用预共享密钥加密)正试图进行身份验证)。

请理解,这不会阻止任何人恶意超载服务器。一旦恶意攻击者收到谜题(无需解决)并再次连接,他们仍可以断开连接。如果攻击是分发的,那就更糟了。

编辑:

@Nick Johnson是对的。您还希望包含随机盐以防止预计算攻击。将salt与哈希一起发送。它与客户端尝试的每个密码连接在一起。

答案 1 :(得分:5)

你所要求的是“工作证明”。这是一个非常简单的问题:

  1. 服务器生成一个随机的nonce n,然后选择多个位b,并将它们发送给客户端。
  2. 客户端计算h = sha1(n + x),其中x是任意后缀,hb'0'位结尾。
  3. 客户端将x作为工作证明发送回服务器。
  4. 这是有效的,因为预测安全散列函数的输出很困难,所以你唯一的选择是暴力。如果服务器要求b尾随0的一个,2^b哈希中的一个平均值将满足该条件,这意味着它们必须平均O(2^(b-1))次工作。

    这种方法的一个警告:如果您正在处理Web客户端,您需要使工作证明足够简单,以便在Javascript中快速完成。但是,与本机代码相比,javascript速度很慢,并且您的攻击者将能够编写本机代码以更快地计算工作证明 - 因此他比合法客户端具有更大的优势。

    标准替代品虽然令人不愉快,但却需要一个CAPTCHA。