(表示我真不想将这个命名翻译成曼珠沙华计划或者石蒜计划这样奇怪的名字的……但是彼岸花计划这名字又太显眼了哎……)

NeoAtlantis应用科学和神秘学实验室的彼岸花计划,开发了一种用于将文字信息可靠地传递给某些特定人群的系统。 没错,本系统本来的目的确实是为了,在实验室负责人出现各种意外情况之后,自动将遗嘱之类的信息发送出去的。 当然,本系统也可以用来传递其他的一般信息,可以通过预先设定的条件,保证看到信息的人应该就是预计的那个人。

1. 这个系统的设计目标

虽然说传递遗嘱这样的信息,早有各种各样的方法,但从隐私和权威性的角度看,计算机技术所能提供的益处有些是传统所不能比的。

首先从对信息的保存上看:在书写了预留的文本信息后,本系统会将这些信息加密,将加密的结果、解密的代码等“打包”到一个单一的网页文件中。 这个网页文件,可以安全地存放在互联网上(至于为什么说安全,下面会提到),被各种备份的技术克隆到各处。直接通过浏览器的另存为功能,就可以制作一份备份。

这种预先将重要的信息存放在多个人手中的方式,可以有效避免传统媒介一旦丢失或者被销毁,就无法恢复的问题

其次,本系统可以同时打包很多条信息(类似很多封信),并提供一种基于密码学的机制,使得信息的作者可以设定,某一封信只能由谁看到。

这种密码学的机制,具体来说,包括两种加密方式:

  • 第一种是基于“分类”的方式,即每个分类下可以收入多条文章,同一个分类使用同一个密码解密。
  • 第二种是基于“问答”的方式,即预留信息时,作者可以预留要查看一条信息需要全部解答的问题。

第一种方式为一个分类的信息设定了一个访问密码,这个设定是必须的。 第二种方式,可以用问答的方式,根据阅读者所掌握的事实,具体区分出一个阅读者。 这两种方式的组合,就确定了能展示给一个读者的信息范围。

简单来说,根据读者相对于作者的不同身份(例如父母、亲人、好友、一般朋友、同事),这个系统会展示不同的信息

密码学的作用实际上还不止于此。本系统未来还可以添加的功能,是使用数字签名,对已经留下的信息进行“签署”。 这种“签署”提供了一种数学的保证,可以向公众证明,展示的信息确实是作者所留下的,未经篡改(或者说,如果被篡改,任何人都能发现被篡改这一事实)。 对于重要的声明、授权一类的内容,这一功能的重要性是显而易见的。

2. 如何使用这个系统

2.1 安装

建议将本系统运行于使用Linux操作系统的计算机上。这样,一些配置工作会比较简单。 在未来,更加便于跨平台的版本,甚至是完全跨平台不需要配置的浏览器版本也是可能出现的。

首先,要安装git这个版本管理工具。git是很多程序员的标配,其安装过程这里就不再罗嗦。使用git,从github克隆本系统的源码:

git clone https://github.com/neoatlantis/manjusaka

之后进入到manjusaka/这个目录中。以后的操作都以这个目录为基础。

本程序为了运行,需要您的系统安装pythongpgmake,这些命令在大多数Linux发行版中都已经预先安装。

为了生成嵌入在网页中的JavaScript代码,目前还需要browserify(用于将所需的JavaScript代码打包成一个文件)和uglify(用于将生成的代码压缩精简)。 这两个程序的安装,需要npm这个程序。npm是用来进行基于NodeJS的开发所用的软件包管理工具,其安装方式网上也有介绍,很可能您的系统的软件源就提供它的安装。

使用npm安装browserifyuglify的方法是一个命令:

sudo npm install -g browserify uglify

这个命令(使用sudo切换到root权限),会为系统全局安装这两个工具。

2.2 预留信息

manjusaka/sample-messages/中,有一些有关如何预留信息的范例。这里详细解释下。

本系统为了生成最终的网页,需要读取并处理您预留的信息。这些信息应当放在manjusaka/messages/目录中。您需要自己创建这个目录。

本系统读取messages目录中的所有以.yaml格式结尾的文件。这些文件应该使用YAML格式书写。 YAML格式是一种很适合人类阅读和编写的数据格式,其带有注释的范例在sample-messages目录中都可以找到。

唯一一个特殊的.yaml文件是_acl.yaml。 这个文件必须存在并按照给定的格式编写,且保存成这个文件名。 该文件的作用是定义访问规则——包括所有可能的消息分类,和问答环节可能出现的所有问题及其答案。

其他的.yaml结尾的文件,都被认为是具体的预留信息,其格式也很简单,主要由一个YAML格式的文件头和消息主体构成。 文件头指定了这个预留信息所属的分类,还可以(但不一定)指定为了阅读这个消息所必须回答的问题。

要注意的是,所有的YAML文件,都必须以UTF-8的编码保存。

2.3 输出结果

在预留了信息之后,在manjusaka/目录下执行命令make,如果没有出错,就会得到manjusaka/build/page.min.html这个结果文件。 在make命令执行完毕后,会在命令行中用

some-category --> [一个很长的密码]

的形式列出要访问各个消息分类所需要的密码,即第一类加密方式的解密密码。请务必记下这些密码。这是您让其他读者解密您的消息的第一步。

您可以将这些密码放入信件,或者电子邮件之类的任何地方——比如有些网站会监测您的网上活跃程度,提供如果您经过一段时间不出现,就会自动发送邮件的服务。 当然,如果您希望有些分类可以时刻被看到,只打算通过第二类加密方式(问答)来限制访问的话,也可以将这个密码直接公开。

如果您使用make test命令,可以在manjusaka/build/page.html得到没有经过压缩的网页输出。 压缩过程会比较耗时,所以这是一种快速检查您的预留信息和访问权限设置是否正确的方法。

3. 密码学实现细节

本系统对每条消息采用对称算法,通过调用gpg进行加密。

对称密钥的产生最终由一个SHA256-HMAC完成。 该函数调用,以下文所述的、据问答环节产生的子HMAC结果作为认证密钥(key),以一个仅仅与消息分类有关的随机密钥(称为CK)为被认证的消息为输入, 得出用来加密一个特定消息的对称密钥。

这个仅仅和消息分类有关的随机密钥(CK1, CK2, …, CKn),就是最终公布的一系列密码。

构成上述调用的参数的key,需要一系列子HMAC结果,其同样是用SHA256-HMAC对CKi进行认证,所采用的认证密钥,则是一系列16字节的随机参数(QK)。 QK并不包含在最终的输出中,而是用gpg的对称加密方式,以各个问答的答案作为密码被加密放在输出中。

这样,“成功获取任何一个QK”,就等于解密以问答答案为密码的gpg密文。 该密文在加密时,选取很大的S2K(String to Key)参数,以拖慢从答案到密文所需要的计算速度,增加字典攻击的难度。

在最终的输出中,加密了QK的密文和问答环节的谜面,以及各个CK的SHA256散列结果(被截断至64比特),构成用来指导程序对人提问的基础数据。 被gpg压缩加密的预留信息,以及各预留信息所需要的问题列表,构成实际的有用载荷。

未来的设计,打算将最终输出的2个部分结合起来,用gpg再次进行加密,使用一个用作“保险开关”的较弱的密码,并进行数字签名。 这个保险开关的设计,既可以在一定程度上阻止预先打算破解问答环节谜底的人, 更重要的是要能在“通知服务”(即各种提供自动发送邮件的服务)出现异常动作时,阻止消息被访问到。(例如,可以将保险密码用某种机制延迟公开)。 数字签名设置在这里,可以对整个程序的参数(包括消息预留者设定的问答规则、问答结果和具体的消息文本)进行签名。