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

Kyl*_*yle 1 security cryptography

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

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

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

Luk*_*uke 5

首先让我说我认为你走错了路.

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

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

编辑:

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


Nic*_*son 5

你所要求的被称为"工作证明".这是一个非常简单的:

  1. 服务器生成一个随机的随机数,n并选择多个位b,然后将它们发送到客户端.
  2. 客户端计算h = sha1(n + x),其中x是任意后缀,并hb"0"位结束.
  3. 客户端x作为工作证明发送回服务器.

这是有效的,因为预测安全散列函数的输出很困难,所以你唯一的选择是暴力.如果服务器请求b尾随0的一个,则2^b散列中的一个平均值将满足该条件,这意味着它们必须在平均O(2^(b-1))工作时执行.

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

标准替代方案,尽管令人不愉快,但需要一个CAPTCHA.