服务器需要几毫秒或更短的时间来计算,并让客户端几百毫秒?
服务器将创建挑战,将其发送到客户端,客户端将计算答案并将其发送到服务器,然后服务器将验证答案。
更新:为什么?服务器具有使用大量处理能力的功能。我不希望客户端能够通过向该功能每秒发送100个请求来恶意地使服务器过载。通过要求回答挑战,攻击者只能以尽可能快的速度发送请求。
答案 0 :(得分:5)
首先让我说我认为你走的是错误的道路。
有了这样的说法,你所描述的一种方法就是将一个简单的谜题组合在一起,这个谜题是接收端强制执行的。例如,您可以发送3或4个字符密码的哈希值(合理地快速解决),客户端需要找出密码(通过暴力)并将其发回(如果您使用预共享密钥加密)正试图进行身份验证)。
请理解,这不会阻止任何人恶意超载服务器。一旦恶意攻击者收到谜题(无需解决)并再次连接,他们仍可以断开连接。如果攻击是分发的,那就更糟了。
编辑:
@Nick Johnson是对的。您还希望包含随机盐以防止预计算攻击。将salt与哈希一起发送。它与客户端尝试的每个密码连接在一起。答案 1 :(得分:5)
你所要求的是“工作证明”。这是一个非常简单的问题:
n
,然后选择多个位b
,并将它们发送给客户端。h = sha1(n + x)
,其中x
是任意后缀,h
以b
'0'位结尾。x
作为工作证明发送回服务器。这是有效的,因为预测安全散列函数的输出很困难,所以你唯一的选择是暴力。如果服务器要求b
尾随0的一个,2^b
哈希中的一个平均值将满足该条件,这意味着它们必须平均O(2^(b-1))
次工作。
这种方法的一个警告:如果您正在处理Web客户端,您需要使工作证明足够简单,以便在Javascript中快速完成。但是,与本机代码相比,javascript速度很慢,并且您的攻击者将能够编写本机代码以更快地计算工作证明 - 因此他比合法客户端具有更大的优势。
标准替代品虽然令人不愉快,但却需要一个CAPTCHA。