算法运行时间长,但易于验证?

时间:2013-05-04 18:01:58

标签: algorithm time

我正在设计一个实验网站,会有一个按钮,用户必须点击并保持一段时间,然后发布,然后客户端将AJAX事件提交给服务器。

然而,为了防止自动点击机器人和快速垃圾邮件,我希望保持时间非常真实且不可跳过,例如做一些计算。关键是浪费实际的CPU时间,这样你就不能简单地猜测AJAX回调值或转动更快的系统时钟来绕过它。

是否有任何算法

  1. 快速&在服务器上轻松生成挑战
  2. 花费一些时间在客户端执行,没有欺骗或缩短时间。
  3. 简单&快速验证服务器上的响应结果?

1 个答案:

答案 0 :(得分:12)

您正在寻找Proof-of-work system

最流行的算法似乎是Hashcash(也在Wikipedia),用于比特币等。基本思想是要求客户端程序找到具有一定数量前导零的哈希值,这是他们必须用暴力解决的问题。

基本上,它的工作方式如下:客户端有某种令牌。对于电子邮件,这通常是收件人的电子邮件地址和今天的日期。所以它看起来像这样:

bob@example.com:04102011

客户端现在必须找到一个随机字符串放在此前面:

asdlkfjasdlbob@example.com:04202011

这样哈希就有一堆前导0。 (我的例子不起作用,因为我只是编了一个数字。)

然后,在你身边,你只需要接受这个随机输入并在其上运行单个哈希,检查它是否以一堆0开头。这是非常快速操作。

客户端必须花费相当多的CPU时间来寻找正确的哈希值的原因是它是一个暴力问题。唯一知道要做的就是选择一个随机字符串,测试它,如果它不起作用,选择另一个。

当然,由于您没有收到电子邮件,因此您可能希望使用某种不同的令牌,而不是电子邮件地址和日期。但是,在您的情况下,这很简单:您可以组成一个随机字符串服务器端并将其传递给客户端。

这种特殊算法的一个优点是可以很容易地调整难度:只需改变你想要的前导零数。您需要的零越多,客户端的时间就越长;但是,验证仍然会花费相同的时间。