Hashcash FAQ 翻译

时间:2022-11-25 23:05:18

译者注

Hashcash 是一种防止垃圾邮件的策略,简单地讲,它就是在邮件中添加一个“戳”/“标记”,可以形象地理解为“邮票”,以此来让接收者去“验证”这不是一个垃圾邮件。

邮票的验证方式,其实就是“部分 hash 碰撞”。

它的设计逻辑是:用 hash 算法生成一个邮票,对于普通用户(正常用户)来说,发一个邮件,去加上这么一个邮票,或者接收邮件的时候去生成一个邮票进行验证,仅仅只是需要一丁点运算成本,它在现代计算机上都是可以忽略不计的。(验证方只需要完成“部分 hash 碰撞”)

除了运算成本,它也不会花费时间成本,因为计算这么一个邮件只需要很短的时间,它最多就是让邮件在发送前会停顿那么一下下,不过如果有更好的实现方式,那完全可以结合“已信任”邮箱(已经相互验证过邮票或者直接知道你是你的那种邮箱),或者根据推测算法,先预计算出邮票。

但这种运算成本对于垃圾邮件发起者来说是灾难性的,因为它不是普通发一两个邮件,它是得在尽可能短的时间内发出尽可能多的垃圾邮件(在被封之前),那种邮件数量是每分钟上万计的,运算成本很大。

其它方面:这种机制需要有邮件系统底层支持,两边都使用这种共识机制才可以。目前已经有多个平台支持。


正文

一、垃圾邮件有什么问题?

垃圾邮件有两方面的问题:

  • 垃圾邮件超载:会把收件箱搞得很乱,特别烦人,当然,也让电子邮件不太好用;
  • 电子邮件不可靠:ISP 和用户使用的反垃圾邮件技术,会降低电子邮件的可靠性,会导致用户经常丢失电子邮件。

垃圾邮件和反垃圾邮件技术导致电子邮件丢失有多种原因,包括:

A、关键词过滤器。

这是一种流行的减少垃圾邮件的方法,它让软件检查电子邮件,通过关键词,把“垃圾邮件”排查出来。这种反垃圾邮件机制可以由 ISP 实施,例如 hotmail 和其它网络邮件提供商,也可以是用户自己安装了一些关键词过滤软件。最近版本的 netscape mail 和 microsoft outlook 都有这样的过滤功能。如果你的电子邮件或向你发送来的电子邮件不小心触发了这些关键词过滤,就会使得查看不了邮件,或者被收进垃圾箱,可能很久后你才会意识到。一般这种情况很常发生,因为过滤软件不是那么智能。

B、过度的黑名单。

如果你的 ISP 或你朋友的 ISP 被给定的黑名单维护者列为垃圾邮件发送者,你的邮件可能会被拒绝。这种情况经常发生,因为黑名单运营商往往可以快速添加黑名单,解决问题的速度却很慢。例如,有几个月我无法收到使用 btinternet.com(英国最大的 ISP 之一)的兄弟的邮件,因为我的 ISP 使用的是一个流行的黑名单,该黑名单已将整个 btinternet 列了进去。问题就在于,现实生活中,ISP 既被普通用户使用,也被垃圾邮件发送者使用,他们的大多数用户都是普通用户。ISP 无法判别注册服务器的用户是不是垃圾邮件发送者。通常情况下,ISP 会在举报后立即封禁滥用者的帐户,但往往黑名单已经先工作了。

一些黑名单甚至引入了惩罚性的除名政策,例如他们将 ISP 保留在黑名单中的时间是 ISP 对垃圾邮件发送者做出反应所用时间的两倍。黑名单运营商是反垃圾邮件斗士和义警,他们对垃圾邮件感到愤怒,并正在自行解决问题。问题是没有服务协议或追索权,因为他们是个人,而且他们的服务通常是免费的。

然而,随着许多 ISP 和公司使用他们的服务,他们的政策被放大并产生了显著的副作用。有时,ISP 会对给定黑名单运营商的惩罚性政策和武断性质感到非常恼火,并以电子邮件可靠性的损失为由起诉他们。几年前有一个这种性质的案例。顺便说一句,ISP 赢了,黑名单也停止运作了。然而,还有许多其它黑名单运营商,垃圾邮件发送者引发的普遍仇恨促使更多人成为黑名单运营商。

C、实际上不被允许的配置。

如果你出于功能原因想要设置开放中继,黑名单运营商和 ISP 将故意破坏你的电子邮件服务。

我试着为一个亲戚这么做,这样他就可以通过我的服务器发送邮件,而不管他使用哪个 ISP(他经常出差)。几个小时内,一个垃圾邮件发送者就发现了我的开放中继,又过了几个小时,我的服务器就被列入了黑名单。我设置了 ESMTP 密码扩展以防止垃圾邮件发送者进入,并在看到发生的情况后立即删除了所有处在队列中的垃圾邮件,但我认为我的服务器仍旧被关在黑名单中。我努力想要从黑名单中出来,但没有收到任何回复。

垃圾邮件发送者和黑名单运营商都在积极探索网络以寻找开放中继。有时,即使没有垃圾邮件发送者可以滥用他的服务,人们也会被列入黑名单,仅仅只是因为黑名单运营商探测并发现了开放中继。

这样的情况下,即使你安全地设置了开放中继,只要你运行开放中继,你的电子邮件可靠性和 ISP 服务也会面临风险。

D、复杂的配置。

垃圾邮件发送者通常伪造他们的电子邮件作为防止被识别的第一道防线。ISP 和用户使用的一些 MTA 软件会执行大量交叉检查,以增加伪造电子邮件的难度。不幸的是,这些交叉检查将拒绝来自任何没有一致 DNS 和反向 DNS 条目的人的邮件。终端用户通常没有资源来提供这种性质的一致条目,并且 ISP 没有动力为其所有用户动态和静态 IP 地址提供此类服务。DNS 服务和 soft-hosting 是更高级别的 ISP 服务,通常他们想为这种事情收取很多费用。

这些交叉检查的另一个副作用是 ISP 配置可能出错的地方更多。如果他们在更改 DNS 条目时不小心未能使他们的反向 DNS 保持最新,或者犯了一致性错误,这也会对电子邮件的可靠性产生不利影响,某些 MTA 会以此为由拒绝接收邮件。

E、受歧视的用户类别。

一些黑名单运营商根据政策将所有宽带 IP 地址范围(电缆调制解调器和 ADSL 用户)列入黑名单,这会影响尝试直接发送或操作自己邮件 hub 的人,只要他们属于此类宽带互联网连接。为了可靠性,宽带用户实际上*使用其 ISP 的邮件 hub。这降低了他们的灵活性(ISP 邮件 hub 可能不会做他们想做的事),并有隐私方面的顾虑,因为他们必须通过这些 ISP 发送邮件。

F、邮件太多太杂乱。

你可能错过邮件的另一个原因很简单,就是当你收到过多垃圾邮件的时候,如果你想快速扫描邮件标题,在 100 封邮件中找到 1 封有用的,这就很容易错过。此外,某些 ISP 对可以保存的邮件数量作了限制,如果没有足够频繁地清除垃圾邮件,邮箱可能会被填满,导致新邮件被退回给发件人。

G、ISP 超载。

ISP 经常因垃圾邮件泛滥而超载。当发生这种情况并且他们的邮件服务器崩溃,或者他们的磁盘填满时,真正的邮件可能会丢失或退回给发件人。

二、Hashcash 怎么起作用?

Hashcash 是一种减少垃圾邮件影响的技术方法,它主要是为了使电子邮件更可靠。这是一种配套技术,需要与其它的反垃圾邮件技术配合起来使用。不管使用哪种反垃圾邮件技术,需要进行一些配置,不然 Hashcash 会被反垃圾邮件技术中设置的过滤器等手段拦截,相应的邮件也就无法可靠、正常地接收;同样的,另一边,发件方也需要 hashcash 能绕过这样的拦截手段(译者注:总之,就是要先在底层建立共识

A、Hashcash 会做些什么?

Hashcash 以邮件程序的插件形式出现,它将 hashcash “邮票”添加到发送的电子邮件中。

hashcash 插件软件将 “X-Hashcash:”这个 header 插入到用户发送的电子邮件的 header 中。下边是一封发给我的电子邮件的示例,电子邮件标题中带有 hashcash 邮票:

From: Someone <test@test.invalid>
To: Adam Back <adam@cypherspace.org>
Subject: test hashcash
Date: Thu, 26 Jun 2003 11:59:59 +0000
X-Hashcash: 0:030626:adam@cypherspace.org:6470e06d773e05a8

blah blah

-Someone

B、发送垃圾邮件的人为什么不用 Hashcash?

垃圾邮件发送者也可以使用 hashcash,但是 hashcash 对他们来说是不好的,因为 hashcash 邮票需要CPU 进行一些计算工作。对于普通用户来说,使用入门级台式机或笔记本电脑,每封邮件的 CPU 开销可以忽略不计。最糟糕的情况也就是在速度较慢的旧硬件上,邮件在发送之前会延迟几秒钟。然而,对于垃圾邮件发送者来说,这是一个灾难:他们希望在帐号被封掉之前通过 DSL 线路每分钟发送 10,000 多封电子邮件。

C、邮件垃圾发送者不会偷一些 CPU 算力吗?

垃圾邮件发送者已经破坏了许多用户计算机的安全性,用来组成“僵尸”军队来发送垃圾邮件。然而,目前垃圾邮件发送者在僵尸机器上发送邮件的速度完全受限于这些机器的互联网连接速度。

典型的 DSL 用户每秒可能能够单独发送 25 条消息,每条消息大小为 1KB(假设上行链路为 256kbit)。或者如果消息一次性抄送多人,那么每秒就可以发送更多消息(译者注:抄送不占带宽?)。在撰写本文时,在最高端的 PC 硬件上,即使是一个 20 bit 的邮票,每个接收者也需要花掉 1/2 秒的时间。这将使每台受感染机器的垃圾邮件发送者的速度降低 10-100 倍或更多(具体取决于发送的消息是单独发送还是同时发送给多个用户)。(译者注:这段没看懂具体分析逻辑)

D、垃圾邮件发送者不会同时发送给很多人吗?

垃圾邮件发送者通常通过一次将邮件直接发送给 100 或 1000 名密件抄送收件人,提高他们可以在给定链接速度下发送的垃圾邮件数量。通过这种方式,他们可以仅消耗 3.5KB 的带宽来向 100 个收件人发送消息,而单独发送每条消息需要占用 100KB 的带宽。这将允许垃圾邮件发送者每秒发送 700 条消息(假设 DSL 具有 256kbit 上行链路)。 分批发送使得垃圾邮件正文都长一样,每个邮件的“可定制化”程度低了,但垃圾邮件发送者通常更关注的是增加他们每秒可以发送的邮件数量。

然而使用 hashcash,对应每个单独的收件人都需要一个单独的邮票,这就可以阻止这种可定制化程度低的垃圾邮件。如果垃圾邮件发送者必须为每个收件人配置一个 hashcash 邮票,即使是 3Ghz Pentium 4 每秒也只能生成 2 个。相比没有 hashcash 的“阻拦”时每秒可以发送 700 条消息,也就是说,使用 hashcash 会减慢垃圾邮件发送者 350 倍。

E、这样不会影响正常邮件的发送速度吗?

不会。最糟糕的情况来看,邮件在发送前会延迟几秒钟,但是高级一点的 hashcash 插件会在写邮件的时候一边生成好邮票,或者先推测你可能想要回复哪封邮件,然后生成邮票。

此外,一些 hashcash 插件可能会自动将经常联系的人列入白名单,比如通讯录中的人,或你回复邮件的人。像基于 CAMRAM hashcash 的系统,它有自动白名单机制。

自动白名单进一步减少了普通用户的开销,因为这样 hashcash 插件只会在你发送给新联系人的第一封邮件上生成 hashcash 邮票。但这对垃圾邮件发送者来说不成立,因为他们不是进行双向通信,他们发送垃圾邮件,这本质上是一种单向过程,几乎不可能有用户将垃圾邮件发送者添加到他们的白名单中。

F、它是怎样使我的邮件更可靠的?

使用关键字过滤、已知垃圾邮件发送者黑名单、反向 DNS 缺失检查等反垃圾邮件技术的 ISP 和收件人开始使用 hashcash 作为反垃圾邮件机制,在邮件上将会有一种邮资形式——hashcash 邮票,它将作为反垃圾邮件检查的依据。这将有助于邮件可靠性,因为垃圾邮件检测器很繁忙且容易出错,经常拦截掉大量非垃圾邮件。

G、目前哪些反垃圾邮件技术可以验证带有 hashcash 邮票的邮件?

从 2.70 版开始,SpamAssassin 支持 Hashcash。SpamAssassin 是一种流行的用户和 ISP 反垃圾邮件工具,可用于添加 hashcash 支持。SpamAssassin 支持关键字过滤(以及其它技术),清除垃圾邮件。查看邮件 headers 有 X-Spam-Checker-Version: SpamAssassin,就意味着 SpamAssassin 会检查收到的邮件。

TMDA 和 CAMRAM 也支持 Hashcash。这意味着通过在你的邮件上发送 hashcash,几乎可以消除错误拦截的可能性。hashcash 支持系统的数量正在增长。

如果你有兴趣为反垃圾邮件系统添加 hashcash 邮票支持,请联系我,Adam Back <adam@cypherspace.org> ,我会尽我所能协助。

H、好像也没什么大不了的,我何必关注呢?

  • SpamAssassin 被 ISP 广泛使用。查看你的邮件 headers,如果有 X-Spam-Checker-Version: SpamAssassin,就意味着你收到的邮件会被 SpamAssassin 检查。
  • 就算你的 ISP 不使用 SpamAssassin,那也要想一下,垃圾邮件正以非常高的速度增长,预估增长速度在每月 10% 以内。以这种速度,电子邮件的可靠性和实用性将迅速下降。反垃圾邮件技术可能会得到加强,以试图压制垃圾邮件的大势,而这会使误报变得更严重,使电子邮件变得越来越不可靠。许多 ISP 已经报告超过 50% 的电子邮件流量是垃圾邮件。
  • Hashcash 是一种实用的工具,可以用来避免这种灾难。但它也需要基础:用户越多,对支持 hashcash 邮票的反垃圾邮件系统的需求就越大;同样,支持 hashcash 邮票的反垃圾邮件系统越多,用户使用 hashcash 插件来提高可靠性的价值就越大。
  • 成为早期采用者,参与解决方案。

I、So when can I bounce messages without hashcash?(译者注:整个问题和整段回答都没看懂,如果没理解错,那就是在说回退邮件在这个机制下怎么运作,答案很简单,直接把回退邮件也打上邮票,或者通过回复邮件就可以直接进白名单。

Well that is a question for each user. The trade-off is if you start bouncing mail without hashcash you may not receive mail that you wish to receive. For general use one should be patient and I figure that point is 10 years or more out, if it ever comes.

There are other more militant view-points however; people who have become so sick of spam, and who receive few unsolicited mails that they would want to read that they’re willing to go straight there.

There are things one can put in the bounce message which allow the sender to compute hashcash stamps. For example there is a java applet which allows anyone with a web browser to compute stamps.

Also the CAMRAM interim approach is to have alternate means to become white-listed, just by replying to emails.

三、Hashcash 邮票机制如何运作?

数学中有许多问题,验证解决方案比计算解决方案容易得多。一个简单的例子是计算平方根。计算机计算平方根比验证它花费的时间更长,也更麻烦。你看验证平方根就只要做个乘法:y = sqrt(y) x sqrt(y)

A、hashcash 使用平方根吗?

不,但颇有渊源。事实上,Dwork 和 Naor 在他们 1992 年发表的论文中提议使用平方根来进行工作量证明。他们的平方根方法,必须用大数——1000 位长,因为计算机在计算正常大小数字的平方根时速度快得惊人。

hashcash 实际使用的方法是“部分哈希碰撞(部分哈希冲突)”。与大数的平方根相比,部分哈希碰撞的验证速度要快得多,而且编程起来也更简单。它们也更小,这使得它们更容易放入电子邮件 header 中使用。

Hashcash 也是非交互式的,这对于电子邮件使用来说是一个有用的属性,它不需要等待对方返回计算平方根的相关数字。使用 hashcash,发送者可以直接选用字符串来计算部分哈希碰撞,不需要交互。

(技术说明:平方根方法有一个由作者提出的非交互式变体,涉及哈希函数并改为取立方根。)

B、哈希碰撞(冲突)是什么?

哈希函数是一种加密函数,它的基本属性是很难找到有两个不同的输入,而产生相同的输出。常见的哈希函数有 MD5 和 SHA1。 (Hashcash 使用 SHA1 哈希函数)。

诸如 SHA1 之类的加密哈希函数被设计为具有抗碰撞性,也就是说很难找到 SHA1(x) == SHA1(y) where x != y

对于 SHA1,预计需要尝试大约 2^160 次不同的 y 值,才能得到与给定 x 值相同的输出。

C、部分哈希碰撞又是什么?

由于计算完整的哈希碰撞在计算上是不可行的,地球上在未来 100 年内都没有足够的计算能力能够实现,所以我们需要简化这个问题。一种简单的方法是接受部分碰撞。也就是说完全冲突是 SHA1(x) 的所有位必须匹配 SHA1(y),而部分碰撞是只需要达到有 k 位匹配即可。

如果我们以 16 个最高有效位为例,那么 16 位部分哈希碰撞会非常实用。像我的工作站(老化的 400Mhz PII)可以在大约 1/3 秒内计算出一个。

D、hashcash 怎么计算哈希碰撞?

在收件人的电子邮件地址上。

在实践中还有一些其它细节。 hashcash 实际上所做的是寻找字符串碰撞,例如:0:030626:adam@cypherspace.org:6470e06d773e05a8,可以在其中看到一个日期(030626 = 2003 Jun 26th)和一个电子邮件地址(adam@cypherspace.org)。第一个字段(0:)是邮票版本号,目前固定为 0。最后一个字段是随机字母串,用来发生碰撞。(我们需要尝试很多不同的字符串,对于 16 位碰撞来说,大概 2^16 次。)

E、我可以怎样测试一下碰撞?

它是使用 SHA1 定义的,因此如果手边有 SHA1 实现,可以尝试一下。按上面的地址,给出的邮票哈希:

echo -n 0:030626:adam@cypherspace.org:6470e06d773e05a8 | sha1
00000000c70db7389f241b8f441fcf068aead3f0

可以看到,前 8 个十六进制数字为 0。前边没有解释,这里说一下。hashcash 试图找到与全 0 字符串的冲突。所以上面的邮票是 32 位的碰撞(译者注:十六进制 1 位,等于二进制 4 位,8 个 0,也就是 32 位)。这是一次大碰撞,我的 400 Mhz PII 花了大约 7 个小时来计算。但对于普通电子邮件,将使用 16 - 20 位范围内的邮票(在大多数硬件上为几分之一秒到几秒)。

F、呃,这些数学把我搞晕了,再给我讲讲?

好吧,你不需要明白加密哈希函数的数学知识就理解它是如何工作的。前面给出的平方根案例很好地类比了它的工作原理。发件人可以计算与收件人电子邮件地址相关的东西(类比前边的计算平方根),而收件人可以验证它(类比反向计算平方验证)。收件人知道发件人只是为他(而不是其他人)创建了这个邮票,因为答案(平方根)是收件人的地址。并且,收件人验证邮票的成本并不高。

你甚至可以用平方根来做,效果是完全一样的。但 hashcash 是使用部分哈希碰撞来做的,它更高效。

四、垃圾邮件发送者不能绕过 hashcash 吗?

A、不能重复使用邮票向许多不同的人发送邮件吗?

不可以,因为邮票只对一个收件人有效。邮票有点像支票:有一个确定的收件人。如果邮票是为 joe@foo.com 定制的,那么除 joe@foo.com 之外的所有收件人都会拒绝该邮票,因为它不是为他们定制的。

B、垃圾邮件发送者不能更改邮票的电子邮件地址吗?

不可以,因为邮票是根据目标电子邮件地址计算的。如果更改电子邮件地址,邮票验证将失败。无法更改现有邮票中的电子邮件地址,只能基于新电子邮件地址从头开始计算新邮票。

C、不能重复使用邮票给我发送大量垃圾邮件吗?

不能,因为邮票只能使用一次。每个收件人都保留一个双花数据库(译者注:double-spend,就是两次花费、两次使用的意思)来执行此规则,如果收到带有已使用邮票的邮件,则拒绝接收。

D、双花数据库不会无限增长吗?

不会,因为收件人只需要保留当前有效的邮票,过期的邮票可以从收件人的双花数据库中删除。每个邮票都包含一个创建日期,到期时间是相对于该日期计算的。

E、这样的话,如果垃圾邮件发送者重新使用旧邮票呢?

只需要验证其旧创建日期。如果过期邮票在过期后再次使用,收件人将拒绝接收。

F、垃圾邮件发送者不能更改旧邮票中的创建日期让它们再次有效吗?

不能,因为邮票也是基于创建日期计算的。如果更改创建日期,那么邮票验证将失败。无法更改现有邮票中的创建日期,只能基于新创建日期从头开始计算新邮票。

G、双花数据库不会被人写满吗?

不会,因为成本太高了。 Hashcash 只会把有效的并且具有足够价值的邮票存储在双花数据库中。与存储它相比,发送者创建有效邮票的成本要更高。邮票到期后,它们将会从双花数据库中删除,存储空间也将被回收。另外,存储邮件的成本将明显高于存储简洁的 hashcash 邮票的成本。

H、不能用未来的日期生成的邮票填满双花数据库吗?

不能,因为创建日期处于未来的邮票会被视为无效而被拒绝,并且不会存储在双花数据库中。

I、如果两个人不小心为同一收件人制作了相同的邮票会怎样?

如果发生这种情况,则会出现问题,因为第二次使用的邮票将被视为无效而被拒绝。但是,hashcash 的设计使得这种情况极不可能发生。它发生的概率类似于连续几周每周都中了国家彩票的概率。

J、如果是 ISP 服务器为用户验证 hashcash 邮票,那岂不是可以把 ISP 服务器搞到超载,让它没法工作?

Hashcash 的验证效率很高。每个邮票在 1Ghz 机器上验证大约需要 2 微秒。换句话说,同一台机器验证邮票的速度比通过 OC12(一种非常快速且昂贵的链路,速率大约 1Gbit/秒)发送电子邮件的速度更快。如果有人向你发送邮件那么快,你这边的瓶颈将是 TCP 栈、邮件服务器和操作系统(译者注:也就是说,真要出问题也是接收邮件方的性能问题,问题不会到 ISP 服务器验证这一环节)。为用户验证 hashcash 不会显著增加邮件服务器负载,因为验证 hashcash 邮票的开销比接收邮件的许多其它操作要低得多。

五、其它技术问题

A、多个收件人的时候呢?

每个接收者需要有一个 X-Hashcash:header,每个收件人查找发给他的 header 并验证。

B、密件抄送收件人呢?(译者注:Cc == 抄送,Bcc == 密件抄送

为了保护密件抄送收件人的隐私和现有的密件抄送语义(其他收件人不知道有密件抄送收件人),每封密件抄送的电子邮件都单独传送。

但是 Bcc: 已经被垃圾邮件发送者用烂了,他们喜欢使用 Bcc,相比带有 100 或 1000 个 Cc: 收件人的邮件,Bcc 就不会那么明显。这导致有些人会删除不是 To: 或 Cc: 给他们的电子邮件。(其实笔者也因为一时轻松有效做过这种事)。

C、我可以使用多个电子邮件地址和邮件转发吗?

当然可以。你只需要告诉你的 hashcash 插件你希望接受邮件的地址。例如你有两个地址 foo@pobox.com 和 foo@isp.com,你的 pobox.com 地址被转发到你的 isp.com 地址。你只需告诉你的 hashcash 插件你用 foo@isp.com 接收邮件,备用地址是 foo@pobox.com

D、邮件列表呢,列表服务器 CPU 不会超载吗?

邮件列表服务器不会为每个收件人创建 hashcash 邮票,因为这确实会使它超载。

当向邮件列表发送邮件时,hashcash 客户端会将邮件列表地址本身视为收件人。事实上,这很正常,因为邮件列表地址看起来就是一个普通的电子邮件地址。

接着注册到邮件列表的用户需要接收来自邮件列表地址的邮件。

E、邮件列表不存在竞争条件吗?

存在。假设一个垃圾邮件发送者订阅了一个邮件列表,用户向该列表发送了带有 hashcash 邮票的消息。如果垃圾邮件发送者行动迅速,他可以在其他用户之前收到一张 hashcash 邮票,然后重新使用它向这些用户发送垃圾邮件,甚至都没有成本开销。

但这是邮件列表的问题,不是 hashcash 的。Hashcash 强调由(单个)接收者验证。这种情况的出现是因为收件人是邮件列表服务器而不是个人地址。显然,邮件列表服务器上留下的任何 hashcash 邮票都可能受到上述竞争条件攻击。

缺少邮件列表身份验证是现在存在的问题。假设有一个邮件列表,现在,垃圾邮件发送者可以伪造一封来自邮件列表地址的邮件,所有收件人都会优先将其处理到用户为该邮件列表设置的文件夹中。我还没有看到过这种情况,但我预计它可能已经发生过了。

有其它方法已用于验证邮件列表流量。例如,有一种软件可以让邮件列表服务器 PGP 对它发送的消息进行签名。

设计 hashcash 的特定方法(避免签名),hashcash 邮票中把邮件正文的哈希值也带上。这可以防止有人利用竞争条件获取和预使用邮票,还可以防止竞争条件被用作 DoS。(当竞争条件被利用时,那些最先收到垃圾邮件的用户永远不会看到真正的消息,他们的客户端会认为它是双花的。)但是,由于 MTA 转换,包含邮件正文哈希是有问题的。在没有轻微改变的情况下可靠地发送准确的正文内容是非常困难的。(空行、编码等)。 PGP 和 S/MIME 等数字签名系统也面临着类似的挑战,它们分别应用文本规范化规则和 MIME 编码来保护电子邮件。

F、垃圾邮件发送者不会给邮件列表发垃圾邮件吗?

是可以的。逻辑就是:他们得到一个免费的开放中继,也就可以拿到邮件服务器,然后向它发送邮件,就相当于给订阅相关列表的数千名用户发送邮件。即使使用 hashcash,垃圾邮件发送者也能获得更多收益:他只需要计算出一个邮票,却可以让很多人收到垃圾邮件。

为了解决这个问题,可以采取不同的策略:

  • 一种方法是只允许订阅者发帖。这对于拥有多个地址的人或根据所在位置使用不同 MTA 的人来说很不方便,因为邮件会被拒绝。这种情况一直发生在我身上,非常烦人。
  • 另一种方法是过滤列表版本或审核列表,甚至审核内容(不仅仅是审查垃圾邮件),但这往往会导致偏见,以及影响言论*。
  • 另一种方法是对列表摘要加上一些反垃圾邮件技术,比如关键词过滤。偶尔会出现邮件因误报而被丢弃的问题。

还有一个称为 NoCeMs 的协作过滤系统,它需要客户端软件,并且在 NoCeMs 持续过程中至少要求有最小的分发延迟。

G、邮件列表竞争条件是否也适用于多收件人邮件消息?

是的,理论上确实如此。在实践中,这个问题通常并不那么严重,因为潜在的垃圾邮件发送者通常无法控制他收到的电子邮件,而且通常它们会被发送给更少的人,因此包含可能导致发生竞争的地址也更少。

另一种防止这种情况的方法是使用 Bcc 进行传递。使用密件抄送,每封邮件都会单独投递,因此每个收件人只能看到寄给自己的邮票。但是,由于垃圾邮件发送者滥用密件抄送语义,有时密件抄送的读取可靠性较低。另一种方法是在保留 Cc header 的同时使用类似 Bcc 的传递(每条消息单独传递)。这确保每个收件人只收到寄给他自己的 hashcash 邮票。

同样,与邮件列表相同的方法也适用于这种情况,也就是 hashcash 邮票中把邮件正文的哈希值也带上。但是,通常过长的 Cc 列表不太常见,因为如果列表地址太多,那么相关的 CPU 成本就会开始增加。

H、自动白名单不会被滥用吗?

如果不使用身份验证,白名单可能会被滥用。白名单用户是不需要彼此发送 hashcash 的用户,如果垃圾邮件发送者可以捕获你的白名单,他就可以假装是你,在不需要邮票的情况下,伪造邮件发送给你的白名单。

解决这个问题的方法是使用身份验证,即使用户已经被列入了白名单。

我在前面有提到,CAMRAM 是一种基于 hashcash 的系统,它提供自动白名单功能。CAMRAM 验证其白名单的方式是使用 hashcash 让其他用户添加你自己,这个过程是需要使用签名的。这可以防止白名单滥用。

实际上,为了短期可部署性,CAMRAM 还引入了替代的添加方式,在这种情况下没有签名,因此理论上可能会受到白名单滥用场景的影响。但这种添加方式已经是下策,一般情况下不用,白名单被滥用的可能性也就不大了。

I、发布到 USENET(新闻组)又如何?

在 USENET 帖子的上下文中,hashcash 邮票将用于使文章免受其它反垃圾邮件技术的影响。USENET 的主要反垃圾邮件技术是取消伪造。与电子邮件黑名单一样,取消伪造有点严谨,用户自行取消他们认为是垃圾邮件的帖子。不过对于同一个内容,有些人想取消,但有些人却觉得那不是垃圾邮件。更不幸的是,有很多非垃圾邮件会被取消,取消者自认为是审查员,并且主观上会想屏蔽某些内容。(译者注:也就是说已经不仅关乎通称的垃圾邮件了

NoCeMs 可以解决这个问题。NoCeMs 不直接取消消息,相反,有多个 PGP 签名的消息会提示垃圾邮件。用户选择 NoCeMs 作者,以此来采用他们的提示。

NoCeMs 似乎是比 hashcash 更好的 USENET 垃圾邮件解决方案。这种场景下,使用 hashcash 可能乍一看是个好主意,但考虑到 USENET 是一个拥有许多读者的广播媒体,因此一个 hashcash 邮票的成本对于垃圾邮件发送者来说可能是经济的。

如果你无论如何都想这样做,我建议最自然的方法是使用 USENET 组地址本身作为收件人地址来生成 hashcash 邮票,例如:alt.privacy.anon-server。在许多邮件客户端中,可以混合使用电子邮件和 USENET 帖子。在将文章抄送给某些电子邮件地址的时候,使用新闻组地址作为收件人,这样可以保持一致。

需要注意的是,USENET 存在的竞争条件问题比邮件列表更严重。由于传播延迟,发布到 USENET 的任何邮票在有用户和服务器收到的几天后才会被另一些用户和服务器收到,这意味着首先收到内容的用户会先使用掉 hashcash 邮票。

如上所述,虽然我认为 hashcash 仅对 USENET 具有边际价值,但如果有人想解决这一限制,可以使用与邮件列表相同的方法,也就是在邮票中包含文章主体的哈希值。

J、mail2news 网关又如何?

Mail2news 网关是允许你发布到 USENET 的电子邮件地址。它们主要与匿名转发器一起使用,因为有一些转发器只能发送到电子邮件地址,而转发器的用户却想发帖到 USENET。给定的 mail2news 网关可能会有额外的或不同的 hashcash 要求,用来限制对其服务的滥用。Michael Shinn 和 Alex de Joode 正在试验针对 mail2news 网关的 hashcash 邮票。Michael Shinn 也在试验基于匿名账户的发帖方案。

K、匿名转发器呢?

与 mail2news 网关一样,个人转发器可能需要 hashcash 来限制对他们服务的滥用。我相信已经有软件支持这一场景,如果我没记错,有一个支持 hashcash 分发的实验性转发器。但这种做法并不普遍。

然而,如果电子邮件是转发器节点之间使用的传输协议,发件人能够为每个节点提供 hashcash 以提高分发的可靠性,这可能会很有用。电子邮件可靠性问题被认为是 I 类和 II 类转发器的主要可靠性问题,当链中出现问题时,发件人永远看不到退回消息,问题会更加严重。

更好的做法还是不使用电子邮件作为转发器之间的传输方式(因为丢失的退回邮件问题是使用模式的系统性问题)。Mixminion(也称为 III 类转发器)默认使用基于 TCP 的交互式 SSL 连接,除了可靠性之外,这种连接还提供了前向保密性,因为可以使用前向保密密码套件。