自毁文档和电子邮件发报系统的制作方法

文档序号:6415534阅读:1154来源:国知局
专利名称:自毁文档和电子邮件发报系统的制作方法
技术领域
本发明涉及以电子方式产生文档的领域,包括电子邮件(“e-mail”)发报,也涉及文档保存和删除的领域。
背景技术
电子邮件发报系统被全世界的商行和个人所广泛使用。电子邮件系统还使用户可把电子报文(message)发送到其它用户并接收来自其它用户的电子报文。电子邮件系统可构成为连到局域网(LAN)的用户提供发报服务,也可构成使用户经由诸如因特网等外部网络往返于LAN外部的用户发送/接收报文。电子邮件系统还使用户可保存、拷贝和转送在电子邮件系统上接收到的报文。
电子邮件系统使用户可容易地保存、拷贝和转送报文,这样带来了妨碍文档保存政策的不想要的结果。通常,由商行来实行文档保存政策,以保证把由商行产生或接收到的文档保存规定的时间然后销毁。此外,可对不同类型的文档规定不同的文档保存周期。文档保存政策的一个对象是为保存和销毁文档提供一种系统方法,从而商行可从给定的时间周期中大致识别哪些类型的文档仍旧存在。
有效的文档保存政策在诉讼角度中也有价值。在该角度下,商行具有与文档的保存和销毁有关的坚定政策且商行实行该政策是重要的。例如,如果商行的文档保存政策规定要把信件保留三年的周期,并坚决地履行这个政策,则不太容易受到对销毁有5年之久的特定信件的指控,这是因为此信件对商行的诉讼身份是有害的。此外,如果没有坚决地履行文档保存政策而只丢弃特定时间周期的一些文档,则剩余的文档将对在此时间内发生的事件产生不完全或不准确的概念是可能的。
对计算机文件坚持文档保存政策的系统是众所周知的。通常,这些系统周期性地扫描网络中的文件并删除在特定日期前产生的文件。然而,由于这种系统在网络上进行操作,所以它们不可能删除存储在个人计算机的硬驱上的文件。为存取这些文件,在每个个人计算机上安装了文档保存程序。然而,即使在每个个人计算机上安装有文档保存系统,该系统仍旧不能删除存储在软盘或其它外部媒体上的文件。此外,这些系统不能删除已经由电子邮件转移到网络外部的计算机的文件。于是,例如,常规的文档保存系统不能删除已转移到雇员的家庭计算机或膝上型计算机或第三方的文件。

发明内容
依据本发明的第一实施例,提供了一种自毁文档和电子邮件发报系统,该系统通过把诸如“病毒”等可执行模块附加到文档或电子邮件报文以在预定时间自动地销毁文档或电子邮件报文。
计算机病毒是众所周知的。一般,计算机病毒是本身附加到宿主文件的可执行代码或程序的一部分。例如,“附加病毒”通过把自己附加到主程序的末尾并使主程序在执行主程序前执行病毒代码来进行操作。相反,“前置病毒”把自己附加到主程序的开始。其它类型的病毒位于主程序的内部。知道另一类病毒是“宏”病毒。这些病毒是嵌入文本文档中的宏,这些病毒可构成在每当打开、产生或保存文档时执行。通常,术语特洛伊马指属于其主文件或程序且不移动到其它文件或程序的病毒。
依据本发明的第一实施例,把具有特洛伊马形式可执行模块在文件(诸如电子邮件报文或文件)创建时附加到该文件。可执行模块包含可执行代码或可执行程序的一部分,它指令计算机在所需的时间改写和/或删除附加了可执行模块的文件。这样,可执行模块对文档或电子邮件报文的寿命加以限制。由于把可执行模块附加到文件,所以即使在把文件拷贝、转送或保存到盘片或磁带驱动器时,可执行模块也将随文件移动。
依据本发明第一实施例的另一个方面,每当打开附加了可执行模块的文件时就执行可执行模块。可执行模块确定是否已碰到文件删除的先决条件。如果碰到先决条件,则可执行模块指令计算机以零数据改写文件然后保存、关闭或删除该文件。
这样,本发明提供了超过已有技术系统的许多优点。例如,由于把可执行模块附加到文件并在打开文件时执行,所以依据本发明的系统即使在已把文件存储在诸如软盘等外部媒体或非网络计算机上时也可坚持文档保存政策。这是因为可执行模块随文件移动且在无论何时何地每当打开文件时就执行。
依据本发明的第二实施例,提供了一种自毁电子邮件发报系统,该系统把可执行模块自动地附加到每个所产生的电子邮件报文或电子邮件报文附件。可执行模块包含可执行代码或可执行程序的一部分,它指令计算机在所需的时间改写和/或删除该可执行模块附加到的报文(和/或报文附件)。当把报文传输到其地址时,可执行模块随报文一起移动,这是因为可执行模块被附加到报文上。此外,即使在把报文拷贝、转送到另一个地址或保存到盘片或其它外部媒体时,可执行模块也保持附加于该报文。
依据本发明的第三实施例,一种文档安全系统包括其中“放置”有一个或多个数字对象(object)的虚拟容器。这样,术语“数字对象”被广泛地使用,它包括文档(诸如电子表格、图表/图形、字处理器文档、ASCII文本文件、图像和其它数据文件)、程序以及可被存储在计算机上的任何东西。文档安全系统包括容器创建工具和容器开启工具。以在计算机上执行的一个或多个软件程序来实行容器创建工具和容器开启工具。容器开启工具使用户可对容器中数字对象的有效寿命加以限制。例如,这些“寿命控制”可包括截止日期、截止日期和时间、文档可被打开的固定次数或其它限制。在由容器开启工具来打开该容器时,容器开启工具检查寿命控制。如果它们有效,则可访问包含在容器内的数字对象以使用户显示或执行。然而,如果寿命控制无效,则容器开启工具将立即销毁该数字对象。
包括容器创建工具和容器开启工具的文档安全系统的一个优点在于,在某些环境下,它与包含可执行模块的自毁文档相比,为寿命控制提供了更稳健的强制力。这是因为当前字处理和电子表格程序执行可执行模块的能力随产品的不同而变化很大。因此,例如,如果打开包括可由Microsoft WordTM执行的可执行模块的自毁文档则该文档将不能自毁,例如一个简单的ASCII文件没有构成识别和执行可执行模块。相反,由此文档安全系统,可把文档固定在由容器开启工具来打开的容器中,容器开启工具在使用时可对容器中的任何文档执行寿命控制,而文档的类型无关。
依据本发明第三实施例的文档安全系统的另一个方面,容器内的每个数字对象可具有独立的寿命控制。依据此特征,当容器内的单个物体期满时,可销毁该物体,而其它物体保持完整。
依据文档安全系统的再一个实施例,数字对象是依据本发明的第一或第二实施例产生的自毁文档。
依据本发明的又一个实施例,可抵挡希望破坏该安全系统的用户来保护容器、其内容及其寿命控制。通过使用加密技术来实行此保护。尤其是,使容器创建工具构成对容器内的物体加密,并使容器开启工具构成对物体解密。这样,如果用户打开一个物体而不利用容器开启工具,则该物体将不可读。
依据第一和第二实施例的另一个方面,通过可执行模块或通过其它工具对自毁文档或电子邮件报文进行加密,使可执行模块构成只在文档或电子邮件报文的寿命还未期满时对文档和电子邮件报文进行解密。
依据本发明的另一个实施例,通过把多个可执行模块嵌入文档或电子邮件报文来产生自毁文档,其中可通过不同的字处理或电子邮件系统来执行每个模块。例如,一个文档可包括可由第一系统执行的第一模块以及由第二系统执行的第二模块。文档本身可以是属于任一个系统的文档。依据此实施例,将执行对文档的寿命控制,而不管该文档是在第一系统还是在第二系统中打开。
依据本发明的再一个实施例,提供了一种利用虚拟容器的因特网商务系统。依据此实施例,希望在因特网上销售可以电子方式传输的产品的一方使用对产品加密并对产品设定时间控制的容器创建工具把产品放置在虚拟容器内。希望在购买产品前对产品看样的产品潜在购买者从销售者处获得容器以及容器开启工具的拷贝。容器开启工具使潜在购买者只能在预选的截止日期前才能观看和使用产品。在此实施例中,容器开启工具不能使用户从虚拟容器中除去该产品。依据此实施例的一个较佳方面,如果在截止日期后打开该容器,则由容器开启工具来删除该产品。依据此实施例的另一个方面,如果销售者在截止日期前接收到产品的付款,则销售者将把独有的密钥传输给购买者。可使容器开启工具构成在接收到此密钥时从容器中释放产品。
附图概述

图1示出可实行本发明的示意的已有技术环境。
图2(a)和2(b)示出依据本发明的电子邮件报文,它们分别包括pre-pending和附加病毒。
图3是用于依据本发明的一个示意实施例产生自毁电子邮件报文的示意方法的流程图。
图4是把宏病毒嵌入图3的自毁电子邮件报文中的流程图。
图5(a)到5(c)示出用于依据本发明一个实施例的自毁文档的图形用户界面,它是为Microsoft ExcelTM文档而实行的。
图6(a)到6(c)示出用于依据本发明一个实施例的自毁文档的图形用户界面,它是为Microsoft WordTM文档而实行的。
图7(a)到7(e)示出用于依据本发明一个实施例的自毁电子邮件报文的图形用户界面,它是为Microsoft OutlookTM而实行的。
图8(a)示出依据本发明一个实施例的文档组虚拟容器。
图8(b)示出依据本发明一个实施例的虚拟容器代理。
图9(a)和9(b)示出本发明的文档组虚拟容器的另一个实施例。
图10(a)示出构成保存单个文档的文档组容器的示意标题格式。
图10(b)示出构成保存多个文档的文档组容器的示意标题格式。
图11示出用于容器创建工具和容器开启工具的图形用户接口。
图12是用于把文档加到图10(b)的文档组容器的示意流程图。
图13是用于从图10(b)的文档组容器中提取文档的示意流程图。
本发明的较佳实施方式图1示出可利用本发明的示意的已有技术环境。局域网1(LAN 1)包括多个办公计算机10.1-10.6(以下集中叫做计算机10)和服务器20。每个计算机10包括各个主存储设备12(诸如硬驱)和各个辅存储设备14(诸如软盘或CD Rom驱动器)。服务器20同样包括主网络存储设备22(诸如硬驱)和辅网络存储设备24(诸如磁带或CD Rom驱动器)。主和辅网络存储设备22、24上的数据是共享的,它可被所有的计算机10所访问。相反,每个计算机10的主和辅存储设备12、14上的数据是私有的,它只能被其各自的计算机10所访问。服务器20经由传输线50对诸如家庭计算机40等网络外的计算机提供因特网访问。家庭计算机40包括主存储设备42和辅存储设备44。LAN 1支持电子邮件发报服务,该服务使每个计算机10在LAN 1内把报文发送到其它计算机10,以及把报文向LAN 1外发送到诸如家庭计算机等网络外的计算机。图1所示的结构是商行中常用的典型LAN的示意。然而,本领域内的普通技术人员应理解,本发明可以各种网络结构来实行。此外,本发明的电子邮件发报系统还可等价地应用于非网络设备,例如,在这些设备中,由独立式计算机经由调制解调器或其它连接来发送和接收电子邮件报文。此外,可通过或不通过至外部计算机的调制解调器或其它连接而在独立式计算机上实行本发明的文档保存和删除特征。
现在将参考图1的结构来说明可依据本发明来减轻的文档保存和销毁物体的一些问题。
为了说明,假设把局域网安装在采用要求销毁超过两年的旧文档的文档保存政策的商行中。通常,通过在服务器20上安装周期性地扫描主网络存储设备22的程序并删除创建日期比当前扫描日期早两年多的文档来实行这种文档保存政策。这种程序的一个问题是,它没有充分地考虑到未存储在网络存储设备中的文档拷贝。
例如,假设用户-1在计算机10.1上创建一文档,并把它存储在网络存储设备22上。然后,在一周以后,用户-1把文档拷贝到计算机10.1的硬驱12.1上以及经由辅存储设备14.1拷贝到软盘上。此外,由于该文档在主网络存储设备22上,所以用户-2可把该文档拷贝计算机10.2的主存储设备12.2上以及经由辅存储设备14.2拷贝到另一个软盘上,而不必让用户-1知道。这样,已产生了该文档的五个拷贝,网络文档保存程序只能访问和删除其中之一。
由图1的LAN提供电子发报业务这一事实使上述问题更为复杂。结果,用户-1可创建一电子邮件报文并经由因特网服务器30把它向LAN外发送到计算机40。此外,可把先前创建的文档文件作为附件插入电子邮件报文中。这样产生了另外的问题。例如,可把电子邮件报文及其附件向LAN外发送到不了解商行的文档保存政策的第三方。在任何情况下,即使只把电子邮件发送到雇员的家庭计算机,该家庭计算机也不能被网络文档保存程序所访问。
通常,对未存储在网络存储设备上的文档执行文档保存政策需要每个雇员搜索其各自硬驱的每个目录以及其每个软盘或其它辅助存储媒体。此外,由于电子邮件系统可包括文档作为电子邮件报文的附件的能力,所以可把较旧的文档隐藏在最新的电子邮件报文中,使得难于识别和删除这些文档。雇员还必须搜索其膝上型和家庭计算机中的商业文件。此外,即使每个雇员都能勤快地进行这些费时的任务,也将存在文档继续留在第三方的计算机上的可能性。
与实行文档保存政策有关的另一个问题是,通常,在从存储媒体删除文档时,并未除去该文档本身。相反,计算机只除去表示该文档在存储媒体中的位置的文档指针。文档本身仍保留在存储媒体中,直到计算机以另一个文档对其进行改写。结果,为了使雇员确保文档确实被删除,他们必须以空字符来改写该文档然后删除文档,从而进一步增加了与执行文档保存政策有关的时间。
嵌入文档或电子邮件报文中的可执行模块依据本发明,提供了一种把可执行模块附加到文档的自毁文档系统。依据本发明的另一个实施例,提供了一种在电子报文或报文附件产生时把可执行模块附加到报文或报文附件的自毁电子邮件发报系统。可以任何公知的方式把可执行模块附加到报文或文档。例如,参考图2,可把可执行模块作为前置病毒(图2A)、作为附加病毒(图2B)或以任何公知的方式来附加。例如,可利用汇编语言、高级编程语言或宏等任何方式来产生模块本身。附加的可执行模块使文档或报文在碰到预定条件时就自毁。这样,可执行模块设定了可控制文档寿命的“寿命控制”。例如,在上述说明中,对可执行模块进行编程,以在当前日期比文档或报文的创建日期晚两年多时删除文档或该文档附加到的报文。依据本发明的再一个实施例,可执行模块在删除文档或报文前以空字符(例如,全都是“X”)来改写文档或该文档附加到的报文。
依据本发明的还有一个实施例,可在出现其它或附加条件时判断改写和/或删除文档或报文。例如,系统可构成在文档i)被关闭或ii)被第二次打开时改写和/或删除报文或文档,从而产生在被销毁前只可读一次的文档。此外,系统还可构成在尝试拷贝、转送或打印报文或文档时改写和/或删除报文或文档。此外,系统还可构成阻止打印或拷贝报文或文档的任何尝试,从而产生只能看而不能打印的文档。还可以一事件来触发这些附加的寿命控制,从而在输入密码或密钥时解除阻止打印或拷贝,或者从而在预定的时间周期或其它事件后施加阻止打印或拷贝。
依据本发明的另一个实施例,该系统可使LAN管理者预定改写/删除条件,从而给所有的系统用户以及由系统用户所创建的所有文档或报文施加文档保存政策。同样,可使该系统构成使每个用户选择特定文档或报文是否包括改写/删除条件。此外,可使用户从各自改写/删除条件中进行选择。例如,这可以通过工具菜单来实现。
现在将描述用于实行自毁电子文档或提供自毁电子报文系统的示例方法。虽然这里所描述的示例实施例是针对Microsoft WordTM、Microsoft ExcelTM和Microsoft OutlookTM环境来加以说明的,但本领域内的普通技术人员应理解可在各自环境下以及以各自方式来实行本发明。
图3和4示出用于Microsoft WordTM6.0文档的自毁电子发报系统的示意图。参考图3,在步骤200,用户开始在例如图1的办公计算机10.1上创建一文档或报文。在步骤220,系统创建“AutoOpen”宏并把该宏保存在“Normal.dot”文件中。依据Microsoft WordTM的构造,每当打开Word文档时,就将执行标题为AutoOpen的宏。把步骤220处所参考的以WordBasicTM编程语言来写的指令作为AutoOpen宏保存在normal.dot模板文件中。Normal.dot是由WordTM程序指定为全局宏的存储文件的模板。在步骤230,把包括AutoOpen宏的normal.dot文件拷贝到名为“message.dot”的文件。然后,在步骤240,从normal.dot文件中删除AutoOpen宏。在步骤250-260,打开message.dot文件,并提示用户插入文档或报文的文本。然后,在步骤270,保存现在包括文档或报文以及normal.dot文件的拷贝的message.dot文件。normal.dot文件的拷贝继而包括AutoOpen宏。在步骤280-290,把message.dot文件更名为message.doc,然后把它作为电子邮件报文或电子邮件报文附件发送。
在因特网上经由LAN服务器20和因特网服务器30把电子邮件报文发送到家庭计算机40。在由报文的收件人打开message.doc文件时,将执行嵌入message.doc文件的AutoOpen宏。图4是被嵌入message.doc文件的AutoOpen宏的流程图。在步骤310,DateSerial()函数返还一表示报文创建日期的系列值作为变量“created”。在创建AutoOpen宏的同时(图3的步骤210和220)就设定函数DateSerial的自变量,把该自变量任意地表示为图3和4中的1997年6月10日。在步骤320,Today()函数返还表示当前日期的系列值作为变量“curdate”。由这些函数所返还的系列值为1和802074之间的整数,1相应于1899年12月31日,802074相应于4095年12月31日。在步骤330,把变量“difference”设定为“curdate”与“created”之差。结果,变量“difference”等于从产生message.doc文件到打开文档的当前日期之间所经过的天数。
步骤340到360构成了一“If,Then”语句,它确定创建日期和当前日期之间所经过的时间是否超过预定阈值。为了说明,已把阈值设定为60天。在步骤340,把变量“difference”与值60相比较。如果“difference”大于60,即如果从message.doc文件创建后已经过60多天,则执行步骤350、360和370。在步骤350,执行EditReplace.Find函数。此函数以空字符(它已被任意地设定为“X”)来替换message.doc文件的每一个字符。然后,在步骤360,保存并关闭已被改写为与message.doc文件中文本字符数目相等的一系列“X”字符的message.doc文件。这样,以空字符改写了从中检索到message.doc文件的存储器位置。相反,如果在步骤340,变量“difference”小于或等于60,则跳到步骤370并报文的收件人能自由地查看和编辑报文。
实际上,可把图4所示的宏修改成进行附加的函数。例如,可把宏修改成通过利用FileNameFrom Window$()函数在打开message.doc文件的同时检索该文件的位置,然后利用Kill函数来删除该文件,这样在message.doc文件被保存后删除该文件。此外,还可把宏修改成使打开message.doc文件的用户推迟报文的删除。
图5(a)到5(c)和以下的表1示出一自毁文档系统,该系统是相对于MicrosoftExcelTM示出的。参考表1,示出用于创建自毁Excel文档的示意的Visual BasicTM程序,该程序包括为Microsoft WindowsTM环境所实现的用户界面。所示的示例利用由Microsoft ExcelTM所支持的“auto_open”和“auto_close”例程。依据所示的实施例,这些例程位于Microsoft ExcelTM的xlstart子目录中的“book.xlt”模板中。这样,把具有auto_open和auto_close程序的book.xlt用作所创建的每个MicrosoftExcelTM文档的模板。因此这些例程位于Excel文档中。
每当创建Excel文档时,就把表1的程序作为宏嵌入文档中。当关闭文档时,实行auto_close程序。在从自定义文档特性(表1的23-26行)中读取变量“lcdata”和“lcmode”后,程序查看是否已对该文档设定寿命控制(表1的28行)。如果已实行寿命控制,则退出auto_close例程(表1的29行)。如果还未实行寿命控制,则程序询问用户是否希望实行寿命控制(图5a)。如果他们希望,则程序请求用户输入该文档的期满日期(图5(b)和表1的35-36行)。然后把期满日期设定为“lcdata”并把“lcmode”设定为“1”(表1的37-38行)。如果用户不希望实行寿命控制,则把“lcmode”设定为“0”并把”lcdata设定为“”(表1的39-41行)。把“lcmode”和“lcdata”的值作为自定义文档特性保存在ExcelTM文档内。
当打开包含嵌入程序的ExcelTM文档时,执行auto_open宏(表1的2-20行)。从自定义文档特性中读取“lcmode”和“lcdata”的值(表1的4-7行)。如果“lcmode”等于“1”(第9行)且当前日期在“lcdata”中的日期以后(第10行),则把该文档的名称存储在变量“fn”(第12行)中,把声明该文档不再有效的报文作为报文框显示在计算机的显示屏幕上(图5(c)和表1的14行),并关闭和删除该文档(第15-16行)。虽然表1的程序在Excelwd被删除前不以空数据来改写该文档,但例如使用如下所述Visual BasicTM程序中的Clear方法可容易地加上此功能If DateValue(Date)>=DateValue(lcdata)ThenRange(“A1”).SelectRange(Selection,Selection.SpecialCells(XlLastCell)).SelectSelection.ClearActiveWorkbook.Save图6a到6c和表2(a,b)示出一自毁文档系统,该系统是相对于Microsoft Word97TM示出的。参考表2(a,b),示出用于产生自毁Word 97文档的示意的VisualBasicTM程序,该程序包括为Microsoft Windows环境而实行的用户界面。所示的示例利用FileSave和FileSaveAs宏来启动寿命控制,并利用AutoOpen宏来执行寿命控制。依据所示的实施例,把表2的程序作为模板嵌入文档中。
每当产生Word 97TM时,就把表2的程序嵌入该文档中。该程序位于作者的工作站上的外部文档模板中,并使用表2c所示的AutoNew宏拷贝到新的文档中。这个宏执行函数“InstallSDD”,该函数从模板SDD.dot中读取表2的程序并使用Microsoft Word Organizer对象把该程序的内容拷贝到新的文档中。依据本发明的本实施例,使用此方法保证了把嵌入的程序封装到文档中。
当保存新文档(表2b的FileSave或FileSaveAS)时,读取变量“lcmode”。如果未定义“lcmode”(即,这是第一次保存该文档),则调用例程“pflmplementLifetimeControls”(表2a),且该程序询问用户是否希望实行寿命控制(图6a,表2)。如果他们希望,则该程序请求用户输入文档的期满日期(图6(b)和表2a)。然后把期满日期存储为“lcdata”并把“lcmode”设定为“1”(表2a)。如果用户不希望实行寿命控制,则把“lcmode”设定为“0”并把“lcdata”设定为“”(表2a)。把“lcmode”和“lcdata”的值作为文档变量存储在Word 97TM文档中。
当打开包含嵌入程序的Word 97Tmwd时,执行AutoOpen(表2b)。使用“pfGetLcmode”和“pfGetLcdata”函数(表2a,2b)来读取“lcmode”和“lcdata”的值。如果“lcmode”等于“1”(表2b),且当前日期在“lcdata”中的日期以后,则把该文档的名称存储在变量中(第12行),把变量“rng”设定为文档的长度,以空数据来改写文档(ret=rng.Delete)然后删除文档(Kill(dlg.name)),并把声明该文档不再有效的报文作为报文框显示在计算机的显示屏幕上(图6(c)和表2b)。
图7(a)到7(e)以及表3示出一自毁文档系统,该系统是相对于MicrosoftOutlookTM示出的。参考表3,示出用于产生自毁OutlookTM电子邮件报的示意的Visual Basic程序,该程序包括为Microsoft Windows环境而实行的用户界面。参考图7(a)和7(b),把名为“Self-destruct”73的制表符加到默认的电子邮件报文模板。图7(a)示出在用户希望创建电子邮件报文时显示的常规“message”制表框74。制表框74包括电子邮件报文文本76和电子邮件接收者的地址77。图7(b)示出自毁制表框,它包括表示报文是否为自毁报文的触发器框71以及其中输入销毁日期的日期框72。如下所述,把销毁日期嵌入电子邮件报文中并在打开电子邮件报文时检索和处理。
Outlook 98支持Visual Basic代码的Outlook Items(诸如报文、日历入口、任务等独立对象)。为每个Item定义事件集合,并可把Visaul basic代码写为与每个事件一致。在Outlook对象模型中,公知的电子邮件报文为“MailItem”。OutlookTM使编程人员可截取和修改应用行为,并截取和修改报文创建和报文打开行为。
表3示出Visual Basic程序,该程序被嵌入电子邮件报文中并在使用Item_Open函数打开电子邮件报文时执行。当产生电子邮件报文时,把一检查输入自毁制表符73的触发器框71,并把一日期输入日期框72,然后把触发器框71的值存储在“Item.UserProperties(“DoDestruct”)”中,并把输入日期框72中的日期存储“Item.UserProperties(“DestructDate”)”中。把这些值与表3的程序一起嵌入电子邮件报文中。当打开此电子邮件报文时,自动地执行嵌入的程序FunctionItem_Open。参考表3,如果DoDestruct特性为False(即,该报文不是自毁报文),则退出该程序并打开电子邮件报文。然而,如果DoDestruct特性为True,则程序通过实行函数“itemExpired”来查看该报文是否期满,继而实行函数“daysTilDestruct”。此函数days TilDestruct从“DestructDate”的值中减去当前日期并返还日期的差值。把由函数days TilDestruct返还的值存储在函数itemExpired的变量“dt”中。如果“dt”小于或等于零,则函数“itemExpired”向函数Item_Open返还布尔型值True,以图7(e)所示的文本“此报文不再有效”来改写报文的文本,并在图7(d)所示的对活框中显示报文“此报文不再有效”,如果“dt”大于1,则“itemExpired”返还布尔型值False,并在图7(c)所示的对话框中显示报文”此报文将在[days TilDestruct]天内销毁”。
表1到3<pre listing-type="program-listing"><![CDATA[ttribute VB_Name=″Modulel″Sub auto_opem) On Error Go To ehEnd Dim lcmode As String lcmode=Active Workbook.Custom DocumentProperties(″lcmode″) Dim lcdata As String lcdata=Active Workbook.Custom DocumentProperties(″lcdata″) On Error Resume Next |f|cmode=″1″ThenIf Date Value(Date)>=Date Vaiue(lcdata)Then   Dim fn As String   fn=ActiveWorkbook.Name   Dim ret   ret=MsgBox(″-fn+is no longer vaiid.″.vbCritical-vbOKOnly,″Purdue/SDD″)   ActiveWorkbook.Close(False)   Kill(fn)  End If End IfehEndEnd SubSub auto_close() On Error Go To ehlmplement Dim lcmode As String lcmode=ActiveWorkbook.CustomDocumentProperties(″lcmode″) Dim lcdata As String lcdata=ActiveWorkbook.CustomDocumentProperties(″lcdata″) On Error Resume Next If lcmode ◇″″Then   Exit Sub End IfehImplement Dim ret ret=MsgBox(″Would you like to impiement lifetime controls in this workbook?″,vbQuestion+vbYesNo,″Purdue/SDD″) If ret=vbYes Then   lcdata =InputBox(″Please enter the expirarion date for this workbook.″,″Purdue/SDD″,Date)   ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcmode″,False,msoProPertyTypeString,″l″)   ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcdata″,False,msoPropertyTypeString,lcdata) ElseIf ret=vbNo Then  ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcmode″,Faise,msoPropertyTypeString,″0″)  ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcdata″,False,msoPropertyTypeString,″″) End IfEnd Sub]]></pre>
表1<pre listing-type="program-listing"><![CDATA[Attribute VB Name=″Utilities″Pubiic Function prGetLcmode(doc As Document)As String On Error Go To ehUnderined Dim Icmode As String lcmode=doc.Variabies(″lcmode) pfGetLcmode=lcmode Exit FunctionehUndetined pfGetLcmode=″″End FunctionPublic Function pfGetLcdata(doc As Document)As String On Error GoTo ehUndetined Dim lcdata As String lcdata=doc.Variabies(″lcdata″) pfGetLcdata=lcdata Exit FunctionehUndefined pfGetLcdata=″″End FunctionPublic Function pfImplementLifetimeControls(doc As Document)As Booiean Dim ret ret=MsgBox(″Would you like to implement lifetime controls in this document?″,vbQuestion+vbYesNo.″Purdue/SDD″) If ret=vb Yes Then   ret=doc.Variables.Add(″lcmode″,″1″}   Dim data As String   data=lnputBox(″Please enter the expiration date of this document″,″Purdue/SDD″.Date)   ret=doc.Variabies.Add(″lcdata″,data) ElseIfret=vbNo Tnen   ret=doc.Variables.Add(″lcmode″,″0″) End If pfSetLc=TrueEnd Function]]></pre>表2A<pre listing-type="program-listing"><![CDATA[Sub FileSave()Attribute FileSave.VB_Description=″Saves the active document or template″Attribute FileSave.VB_ProcData.VB_Invoke_Func=″Normal.NewMacros.FileSave″ Dim lcmode As String lcmode=pfGetLcmode(ActiveDocument) If lcmode=″″Tnen   Dim ret As Boolean   ret=pflmplementLifetimeControls(ActiveDocument) Else End If ActiveDocument.SaveEnd SubSub FileSaveAs()Attribute FileSaveAs.VB_Description=″Saves a copy of the document in a separatefile″Artribute FileSaveAs.VB_ProcData.VB_Invoke Func=″Normal.NewMacros.FileSaveAs″ Dim lcmode As String lcmode=pfGetLcmode(ActiveDocument) If lcmode=″″Tnen   Dim ret As Boolean   ret=pflmplementLifenmeControist(ActiveDocument) Else End If Diaiogs(wdDiaiogFiieSaveAs).ShowEnd SubSub AutoOpen() Dim doc As Document Set doc=ActiveDocument Dim lcmode As String lcmode=pfGetLcnode(doc) Dim lcdata As String lcdata=pfGetLcdata(doc) If lcmode=″1″Then   If Date Value(Date)>=DateValue(lcdata)Then  Dim mg As Range  Set mg=doc.Content()  ret=mg.Delete()  doc.Close(wdSaveChanges)  Kill(dlg.Name)  ret=MsgBox(″This document is no longer vaiid.″&amp; Chr(13) &amp;″Ithas been destroyed.″,vbCritical-vbOKOnly.″Purdue/SDD″)  Exit Sub   End If End IfEnd Sub]]></pre>表2B<pre listing-type="program-listing"><![CDATA[Suo AutoNew()  Call InstallSDDEnd SubSub InstallSDD()   Dim tPath As String   tPath=Options.DefaultFilePath(wdUserTempiatesPath)   tPath=tPath+″\SDD.dot″   On Error GoTo errHandler   Application.OrganizerCopy_   Source=tPath,_   Destination=ActiveDocument.Name,_   Name=″SDDModule″,_   Object=wdOrganizerObjectProjectltems   Exit SuberrHandler   MsgBox″Could not load self-destructing document module.″   Exit SubEnd Sub]]></pre>表2C
<pre listing-type="program-listing"><![CDATA[Function Item_Open()  If Item.UserProperties(″DoDestruct″).Value=False Then  Item_Open=True  Exit Function  End If  If itemExpired()Then  Item.Body=″This message is no longer available.″  Item.Save()  MsgBox(″This message is no longer available.″)  ElseMsgBox(″This message will destruct in″&amp; daysTilDestruct()&amp;″days.″)  End IfEnd FunctionFunction itemExpired  dt=daysTilDestruct()  If dt<=0 Then   itemExpired=True  Else   itemExpired=False  End IfEnd FunctionFunction days TilDestruct  daysTilDestruct=DateDiff(″d″,Now().ltem.UserProperties(″DestructDate″).Value)End Function]]></pre>表3此外,依据上述自毁文档的可执行模块还可利用加密技术来防止用户例如通过以不能执行可执行模块的应用程序打开自毁文档来使寿命控制失效。依据这样的实施例,当第一次保存或关闭一个文档时,可执行模块将对该文档加密。然后,当后来打开该文档时,可执行模块将只在寿命控制有效时才对该文档解密。此外,如果以不能执行可执行模块的应用程序来打开文档,则文档将保持加密,且用户不能查看该文档。作为一个例子,如果用户产生用WordPerfectTM应用程序来打开自毁Microsoft WordTM文档,则WordPerfectTM应用程序将不能执行Microsoft WordTMAutoOpen或FileOpen宏,且无论该文档的寿命控制是否有效,该文档都将被打开。然而,如果预先通过AutoClose、FileSave或FileSaveAs宏(例如,使用如下所述的异或多字母码)对自毁Microsoft WordTM文档进行加密,则文档将保持加密,除非用户使用执行这些宏的应用程序(包括异或多字母密码的相应解密算法)来打开文件。选择适当的加密技术将依据所需的安全程度以及用于实行该技术的宏或描述文本(script)。
虚拟容器现在将描述利用虚拟容器的依据本发明的文档安全系统。
依据图8a所示文档安全系统的第一实施例,文档组容器500用于存储一个或多个文档510(或其它数字对象),每个文档具有独立的寿命控制520。在用户希望打开和显示容器内容的任何计算机上安装一工具。该工具使文档的寿命控制在把文档显示给用户前有效。如果寿命控制有效,则从容器中提取的文档可被用户所使用。如果寿命控制无效,则例如通过以空数据改写文档来销毁文档。
依据图8(b)所示文档安全系统的第二实施例,容器代理500′可用于存储单个文档510′(或其它数字对象)。把代理处理程序安装在用户希望打开并显示代理容器中的文档的任何计算机上。与文档组容器不同的是,代理的操作对于用户是不可见的---除非文档的寿命控制520′无效。为了提供此透明度,对代理进行命名或编码而显示为文档的普通实例,可改变把文档与其应用程序相关联的操作系统机构以使文档改为与代理处理程序相关联。如果寿命控制有效,则代理处理程序将过渡性地完成文档与应用程序之间的关联。本实施例利用了这样的优势,即在例如通过鼠标器单击“My Computer”中Windows 95文档图标、Windows 95TM桌面中的文件或Windows 3.1的文件管理器中的文件来访问文件时,操作系统将尝试把该文件与诸如MicroSoftTMWord、Microsoft ExcelTM或WordPerfectTM等应用程序关联。依据容器代理,把容器代理工具插在操作系统和应用程序之间,从而在用户访问容器代理(它将作为普通文档呈现给用户)时,操作系统将调用容器开启工具来自动地打开该容器,如果寿命控制有效,则将启动该应用程序并打开该容器中的文档。如果寿命控制无效,则例如通过以空数据改写文档和/或删除文档来销毁该文档。依据容器代理的另一个实施例,系统可构成在应用程序被关闭时把文档自动地返还容器代理。
现在将讨论文档组容器(DS容器)的各种实施例。依据DS容器的第一实施例,提供了容器开启工具和容器创建工具。容器创建工具位于用户希望创建DS容器的计算机上,此工具的名称暗示着它可用于创建DS容器、指定寿命控制并把文档置于DS容器中。容器开启工具位于用户希望打开DS容器的计算机上,此工具可用于打开DS容器、检查寿命控制的有效性以及在寿命控制有效时从DS容器中提取文档。如果寿命控制无效,则例如通过以空数据改写文档来销毁该文档。依据一个实施例,DS容器只包含一个文档。依据另一个实施例,可在单个容器中存储多个文档,每个文档可具有它自己的寿命控制。在想要使用户可打开DS容器而不是创建DS容器时,可把容器开启工具而不是容器创建工具安装到计算机上。未打开的DS容器作为单个文件呈现给用户,它包括标题信息(例如,包括寿命控制)以及该文档或这些文档本身,而与DS容器中所存在的文档数目无关。
依据本发明的多文档DS容器的另一个方面,DS容器可包括容器标题,此标题包含该容器的控制信息并引用两个流的单链接列表。第一链接列表包含活动(active)流,第二链接列表包含非活动流。活动流相应于仍具有有效寿命控制的文档,非活动流相应于具有无效寿命控制或已从容器中除去(删除)的文档。活动和非活动流都具有标题,这些标题包含用于其相应流的寿命控制(以及最好是如下所述的加密信息)。这些流的标题中的每一个都包含对其列表(无论是活动的还是非活动的)中下一个流的引用指针(reference)或表示该流是其列表中最后一个流的指示符。每个流是二进制数据的连续块。
在使一个流无效或从容器中除去时,把其流标题标记为非活动并移动到非活动流列表中,并以空数据来改写该流。在把新的流加到容器中时,可在非活动流的长度足以包含此新的流时重新激活并使用此非活动流。如果没有非活动流或它不足以包含新的流,则可在容器中创建和激活新的流。如果容器的活动和非活动流列表经过许多变化,则该容器将变得碎片化。换句话说,在文档期满并被空数据替换时,活动文档可能被夹在只包括空数据的一个或多个非活动文档之间。在本发明的一个较佳实施例中,容器创建工具可检测此情况并对容器作必要的压缩。
图9(a)和(b)示出本发明的活动/非活动流的实施例。图9(a)示出已创建了三个文档包含在其中的虚拟容器。如图9(a)所示,容器标题包括容器信息(诸如容器的名称、容器的默认寿命控制、容器创建的日期、最后修改容器的日期DM 804以及最后访问容器的日期)、与活动流有关的信息(诸如对活动流中第一个文档的指针和活动流中文档的数目)以及与非活动流有关的信息(诸如对非活动流中第一文档的指针以及非活动流中文档的数目)。容器中的每个文档包括文档标题,该标题包括寿命控制信息以及其各自流中下一个文档的指针。自从创建容器时,这三个文档就处于活动流中,容器标题包括活动流次标题,该次标题包括对第一个文档的指针以及表示这三个文档都处于活动流中的指示。非活动流次标题包括空信息。然后,在图9(b)中,已把两个新的文档(文档4和5)加到容器中,且文档2已期满。虽然活动流容器次标题仍旧指向文档1,但现在文档1标题中的指针指向文档3而不是文档2。此外,现在非活动流容器次标题指向文档2。
如上所述,依据本发明的虚拟容器包含一个或多个文档,应在这些文档不再有效时销毁它们(由其寿命控制来确定)。一般,使这些控制失效所需努力的成本应超过延长文档的有效寿命的价值。
依据本发明的一个较佳实施例,为了防止对虚拟容器中的文档进行未授权的访问并防止用户使文档的寿命控制失效,对该容器中的文档进行加密。例如,这些加密技术可被这里所述的任何虚拟容器所使用,包括图8a、9a和9b中的DS容器以及图8a的代理容器。
依据本发明的另一个实施例,该系统使作者根据包含在其中的文档的已知值从几个安全等级中进行选择。一般,随着安全等级增加时,使它失效所需的努力也增加---从而安全本身的成本和复杂性也增加。在描述如何在虚拟容器中使用加密前,将讨论加密技术的某些基本原理。
加密技术概况一般,加密技术(通常被叫做加密系统)由两个基本成分所构成算法和密钥。算法是转换数据的数学函数。密钥“指示”转换的确切特性。
加密算法可以公开或保密的。公开算法由其设计者所公开,由学术界考察并通过商业启用来审核。保密算法是设计者不希望公众了解或使用的专利成果。一般,在商业产品中使用的加密算法是“公开”算法。一般,可把已公开、考察并在经过长时期的广泛实行后仍旧在使用的加密算法作为安全的算法,因为它已受到大多数研究所的分析以及全世界的计算机科学的学生的攻击而未受到危害。
一般从有效加密系统的密钥中得到其强度。假设加密算法已被宣布(如上所述),则加密系统的安全性有赖于产生适当的密钥以及小心地保护其保密性。合适性的一个重要措施是密钥的长度---通常以位来表示。短的密钥有利于快速的加密和解密,但加密的报文更容易被破译。长的密钥需要长的加密和解密处理,但有可能根本就不能破译。这种领悟力非常普遍,从而美国政府允许自由而公开地使用任何加密算法,但对密钥的长度有严格的限制。
虽然依据本发明可使用各自公开和保密的加密技术,但这里将对四个加密技术进行简要地讨论对称算法、公共密钥算法、数字签名(signature)和单向散列(hash)。
对称算法一般依赖于单个密钥来对报文进行加密和解密。这些算法容易理解和使用,并在适当使用时提供了相对高的安全等级。然而,双方必须在通信前商定密钥,而不要把给密钥意外地泄露给第三方。此外,必须使密钥永远保密,或者可在以后对较老的报文进行解密。对称算法尤其适用于临时报文---在通信结束后不保存的报文。如果不保存该报文,而密钥又被破坏,则以后没有机会对该报文进行解密。流行的对称算法是数据加密标准(Data Encryption Standard),它是一ANSI和ISO标准并已使用了二十多年。
公共密钥算法使用一对密钥---一个叫做公共密钥,另一个叫做私人(private)密钥。可使用公共或私人密钥对报文进行加密,并使用另一个密钥对该报文进行解密。只有私人密钥可对以公共密钥加密的报文进行解密,只有公共密钥可对以私人密钥加密的报文进行解密。此外,给定了公共密钥,实际上就不可能设计出其它的私人密钥。通常,在某些公知的可靠场所(可能是因特网上的数据库或目录)中公开任何对的公共密钥,而所有者保留私人密钥。适用于公共密钥加密的常见情景如下Alice想给Bob发一个机密的报文。Alice可从可靠的源处获取Bob的公共密钥。她使用该密钥对她给Bob的报文进行加密。当Bob接收到此加密报文时,他可使用自己的私人密钥对此报文进行解密。如果a)Alice已获取Bob的真实公共密钥(而不是伪造的),且b)Bob是其私人密钥的唯一所有者(没有人有该密钥的拷贝),则Alice可确认只有Bob可读取她的报文。流行的公共密钥算法是由RSA Data Security,Inc.所拥有的RSA加密系统。
把数字签名设计成证明报文作者的身份。虽然有许多实行数字签名的方法,但公共密钥加密非常普遍。我们可把以上所讨论的情景延伸到如下所示。Alice想要给Bob发一个私人报文,她想让Bob确信此报文是她发的。毕竟,先前的情景没有证实Bob接收到来自Alice的报文;它只使Alice确信她给Bob的机密报文不可能被其它人阅读。因此,Alice首先用她的私人密钥对给Bob的报文进行加密。然后,她再如上所述使用他的公共密钥对该(已加密)报文进行加密。当Bob接收到该报文时,他首先使用自己的私人密钥对其进行解密。然后,为确信此报文是否的确来自Alice,他从可靠的源处获取Alice的公共密钥。他使用该密钥对Alice的报文进行解密。如果a)Bob确信Alice的密钥还未通过拷贝或伪造而破坏(如上对Bob所述),且b)Alice确信Bob的密钥还未被破坏,则Alice仍可确认只有Bob可以阅读她的报文,Bob也可确认此报文来自Alice。RSA Data Security,Inc.生产了被广泛使用的数字签名算法。
虽然数字签名是在数字领域中证明身份的可靠的方法,但还存在要证明文档的原作者而不需要传递整个(可能很大)文档的情况。单向散列提供了已知很好的解决方法。它们是把任何数组(文档或其它)转换成小的二进制信息流的数学函数。单向散列函数的一个重要特征是,该函数不会从两个不同的源中产生两个相同的散列。为产生具有此特征的单向散列,在学术和商业研究上已耗费了许多精力。MD5是产生128位散列的公知的单向散列函数。
加密技术运用于虚拟容器根据本发明的较佳实施例,虚拟容器文档安全系统允许用户(和/或系统管理员)选择不同的安全等级。第一级安全等级可以不对文档进行任何加密。文档的安全性是根据容器收件人采用容器开启工具显示文档的要求导出的。然而,可以采用市场上出售的几种二进制文件编辑器中的任何一种编辑器将容器自身作为单个文档打开,由此观看文档内容。同样,由于绝大多数字处理程序允许用户从文档恢复ASCII正文,因此能够采用这种程序将容器自身作为单个文档打开,由此观看文档内容。
第二级安全等级可以是一种称为异或多字母密码的对称加密形式。这种加密算法以软件执行是简单的,它能非常快地操作。这种加密算法采用单个密钥对文档既加密又解密。这个密钥可以“硬编码”到软件中,它能够随软件而分发并由用户周期地改变,或者在每次需要它时从可靠源处获取。按照这一方法,文档是采用密钥与文档的异或(即[Document]XOR[key]=[Encrypted Document])对文档加密。例如,容器开启工具和容器创建实用工具可以包括既加密又解密的单个“硬加密”对称密钥。文档的作者利用容器创建工具对文档和任选的文档寿命控制进行加密。当作者希望分发文档时,他把该加密文档转送到虚拟容器中。收件人利用容器开启实用工具对文档及其寿命控制进行解密。容器开启实用工具检查寿命控制,如果是有效的,向收件人显示文档。如果寿命控制不是有效的,容器开启实用工具销毁文档。
更高一级的安全等级可以利用中央授权(central authority CA)进一步保证文档的安全性。按照CA系统的第一实施例,作者将文档及其寿命控制送至CA。CA返回文档的唯一标识符。当作者希望分发文档时,他将该唯一标识符传送给收件人。收件人将该唯一标识符传送给CA对文档进行评审。CA检查寿命控制,如果是有效的,那么将文档返回到请求人。请求人接收并显示文档。虽然CA的使用增强了安全性,但是,它具有需要中央授权干预的缺点。
CA系统的另一个实施例采用单向散列。按照这个实施例,作者将文档及其寿命控制传送至CA。CA对寿命控制进行散列(混编)并将原始寿命控制、散列寿命控制和文档组合到一个容器中。CA用其私人密钥对该容器进行加密并将数据包返回给作者。当作者希望分发文档时,他将有CA签字的容器传送给收件人。收件人采用CA的公共密钥打开该容器并对寿命控制进行检查。如果它们是无效的,那么容器被销毁。如果它们是有效的,那么对它们进行散列并将该散列与存储在容器中的散列进行比较。如果散列不匹配,那么容器被销毁。如果散列匹配且寿命控制是有效的,那么文档被显示。
CA系统的再一个实施例采用单向散列和对称密钥。按照这一实施例,作者将文档及其寿命控制传送给CA。CA产生唯一对称密钥(以下称为DK)并对文档进行加密。它将文档的DK和唯一标识符(以下称为DKID)记录在其数据库中。CA对原始寿命控制进行散列,并创建包含原始寿命控制、散列寿命控制、加密文档和DKID的容器。它用其私人密钥对数据包签字并将该数据包返回给作者。当作者希望分发文档时,他送出有CA签记的数据包。收件人采用CA的公共密钥打开该数据包。它将原始寿命控制、散列寿命控制和DKID传送给CA。CA对寿命控制进行检查。如果是无效的,那么CA停止。如果它们是有效的,那么对它们进行散列并将该散列与从收件人那里接收的散列进行比较。如果散列不匹配,那么CA停止。如果散列匹配且寿命控制是有效的,那么CA将对应于DKID的DK返回给收件人。收件人用DK对文档进行解密并显示该文档。
本实施例的一个问题是收件人能够通过创建新的寿命控制、对它们进行散列以及采用容器的原始DKID将散列的新的寿命控制传送给CA而击败系统。按照本实施例的另一方面能够缓解这一问题,其中CA创建原始寿命控制、散列寿命控制和DKID的加密分容器。只要CA知道加密密钥(如对称密钥或公共密钥或私人密钥)。收件人(他不能用这些密钥接入分容器)将该分容器传送给CA。然后,当CA对分容器进行解密时,它能够确信从分容器恢复的寿命控制、散列寿命控制和DKID是由CA创建和加密的。
以JavaTM编程语音实施虚拟容器现在将描述含有一个文档并采用异或多字母密码的DS容器的一个示范实施例,其中,容器创建和容器开启实用工具是以JavaTM编程语音编程的。容器创建和容器开启工具是利用数据和文件流类实施的,数据和文件流类形成Java编程语音的标准I/O封装的一部分。特定流类的每个对象对应于存储器的一组相邻字节。
根据本实施例的DS容器包括容器标题(它包括容器的控制信息)和容器中文档的文档标题。虽然DS容器的这个实施例设置成仅容纳一个文档,而以下描述的另外实施例能够容纳无数个文档。参考图10a,按照该单个文档DS容器实施例的较佳实施,容器标题包括容器名称CNAME 701、创建容器的日期DC 703、最后改动容器的日期DM 705、最后访问容器的日期DLA 704以及容器706中的文档数目(或是0或是1)。容器还包括一个文档710。该文档的标题包括文档名称(707)、文档的寿命控制(708)和文档的长度(709)。按照这一实施例,DC 703、DM 704和DLA 705字段允许用户确定创建容器的日期、最后改动容器的日期和最后访问容器的日期,正如以下参照表5(a)的视图方法所说明的。如果不需要这样的功能,自然可以省略容器创建、最后改动和最后访问字段。
以下参考表4(a),通过调用方法“public static int create(Stringenvelopefilename)”创建DS容器,该方法包括字符串“envelopefilename”作为其变元。如果“envelopefilename”是一个现有文件名,或者如果它取空值,那么返回出错,否则程序继续创建新的容器。对象“fos”被限定在拥有目的文件名“envelopefilename”的FileOutputStream中。相应的对象“dos”在用于容纳对应于对象“dos”的目的数据(它是“envelopefilename”)的DataOutputStream中被定义。然后,程序创建标题,它将被存储在DataOutputStream对象“dos”中。在这方面,对象“eh”被限定在类SdeEnvelopeHeader中,类SdeEnvelopeHeader的“d_name”字段设定为字符串“envelopefilename”,“d_created”、“d_last_modified”和“d_last_accessed”字段设定为当前日期。然后,调用方法“writeTo”(表4(c)),它将容器名称、容器创建日期、最后改动容器的日期、最后访问容器的日期以及容器中文档的数目(当前为0)写入到对象dos中,由此创建新创建容器的容器标题。采用这种方式,容器将作为一个载有“envelopename”中所含名称的单个文件而出现。
参考表4(b),为了将文档增加到容器中,调用addDocument方法。方法addDocument取“envelopefilename”、“documentfilename”和“expires”为参数。如果任何参数为零,那么返回出错。如果不存在名称为“envelopefilename”的容器,那么调用“create”方法(表4(a))来创建容器。如果不存在名称为“documentfilename”的文档,那么返回出错。否则,FileInputStream的对象“fis”定义为“envelopefilename”,DateInputStream的对象“dis”定义为对应于“envelopefilename”的数据(DateInputStream(fis))。以这种方式,以“fis”和“dis”打开名称为“envelopefilename”的容器。然后,创建名称为“[envelopefilename].tmp.”的临时容器。在这方面,FileOutputStream的对象“fos”被定义为“[envelopefilename].tmp.”,DataOutputStream的对象“dos”被定义为对应于“[envelopefilename].tmp.”的数据(DateInputStream(fos))。
为了更新封壳标题,那么创建SdeEnvelopeHeader的对象“eh”,用方法“readFrom”(表4(c))将“dis”(它是“envelopefilename”的容器标题)的内容读入到“eh”中。再参考表4(b),对类SdeEnvelopeHeader的对象“d_last_modified”和“d_total_documents”进行更新,将更新的封壳标题(eh)写入到DataOutputStream的对象“dos”中。
为了更新文档标题,将文件的对象“file_doc”设定为“documentfilename”的路径,将变量“length”设定为与位于“file_doc”处的文件的长度相等。FileInputStream的对象“fis_doc”设定为容纳文件“documentfilename”。然后,创建SdeDocumentHeader的对象“dh”,并将类SdeDocumentHeader的“d_name”字段设定为字符串“documentfilename”,将“d_expired”字段设定为参数“expires”的值,将“d_total_bytes”字段设定为变量“length”的值。然后,调用方法“writeTo”(表4(d)),它把文档名、期满日和文档长度写入对象dos,由此创建文档的文档标题。
然后,将文档读入到变量“ch”(int ch=fis_doc.read())并通过在“ch”上执行异或功能对文档加密。然后,将加密文档写入到对象“dos”中。以这种方式,利用DataOutputStream功能已经将经过更新的封壳标题、文档标题和加密文档写入到存储器的相邻位置中,并已创建了含有一个加密文档的DS容器。然后,删除原始容器(envelopefilename),将已更新的容器(“[envelopefilename].tmp”)改名为“envelopefilename”。以这种方式,容器将作为载有包含在容器CNAME 71字段中的名称的单个文件出现,将包括容器标题、文档标题和文档。
现在参考表5(a)和5(b)描述DS容器的开启工具的实施。表5(a)示出观看按照表4(a)至4(c)创建的DS容器的容器标题的程序。方法“view”包括两个参数,即字符串“envelopename”和PrintStream“ps”。如果“envelopename”或“documentfilename”都不是“空”并且如果存在名称为“envelopename”的容器,那么,FileInputStream的对象“fis”定义为“envelopefilename”,DataInputStream的对象“dis”定义为对应于“envelopefilename”(DataInputStream(fis))的数据。以这种方式,以“fis”和“dis”打开名称为“envelopename”的容器。然后,创建SdeEnvelopeHeader的对象“eh”并采用方法“readFrom”(表4(c))将“dis”(它是“envelopefilename”的容器标题)的内容读入到“eh”中。最后,利用方法“println”打印容器标题信息。
表5(b)示出用于打开按照表4(a)至4(d)创建的DS容器的程序。方法“extractDocument”包括两个参数,即字符串“envelopefilename”和“documentfilename”。如果“envelopename”或“documentfilename”都不是“空”并且如果存在名称为“envelopename”的容器,那么,FileInputStream的对象“fis”定义为“envelopefilename”,DataInputStream的对象“dis”定义为对应于“envelopefilename”(DataInputStream(fis))的数据。以这种方式,以“fis”和“dis”打开名称为“envelopename”的容器。然后,创建SdeEnvelopeHeader的对象“eh”并采用方法“readFrom”(表4(c))将“dis”(它是“envelopefilename”的容器标题)的内容读入到“eh”中。然后,创建SdeDocumentHeader的对象“eh”并采用方法“readFrom”(表4(c))将类SdeDocumentHeader中“dis”(它是文件标题)的内容读入到“dh”中。然后将字段“d_name”与“documentname”进行比较,如果它们是相同的,那么程序继续检查文档“documentname”的期满日。利用日期方法“before”,如果字段“d_expires”中的日期在当前日期之前,那么,将变量“valid”设定为假。如果不是,将文档的路径放入类文件的对象“file_doc”中。
假设存在文档“documentname”并且该文档未到期,将对象“file_doc”设定为新路径“[documentfilename].x”,将FileOutputStream的对象“fos_doc”设定为FileOutputStream(file_doc)。以这种方式,临时文件“fos_doc”是由类FileOutputStream创建的。然后,一次一字节地将文档读入到变量“ch”中。通过对“ch”执行异或功能又对每个字节进行解密并写入“fos_doc”中。如果文档不存在,将“fos_doc”设定为空值,程序指示文件不存在,如果文档存在,但是期满,将“valid”变量设定为假。这可以防止“fos_doc”与该文档相关,防止文档的解密,并使程序指示文档期满。为了改写文档以便销毁它,可以将下列指令插入表5b中<pre listing-type="program-listing"><![CDATA[if(valid=Faise){  for(long 1=0,1<dh.d_total_bytes;1++)  {   int ch=0   fos_doc.write(ch)  }}]]></pre>图11(a)和11(b)示出能够被用于既实施以上针对表4和5所述的单个文档DS容器和又实施以下针对图12和13所述的多个文档DS容器的单个图形用户接口。为了创建DS容器,用户单击“New”按钮1510。然后将出现对话框(未示出),它将提示用户输入容器名。一旦已经输入容器名,将创建DS容器,容器名将显示在题标1500上。在图11(a)和11(b)中,容器名为“demo.env”,容器作为文件“demo.env”存储在“C\”目录中。为了将文档增加到DS容器中,用户单击“Add”按钮1520。然后将出现文件菜单(未示出),它将允许用户或是浏览所需文档的使用目录或是直接输入路径和文档名,一旦已经选择文档,并且期满日已经输入框1540中,那么文档将被增加到容器中。一旦文档已经成功地增加到容器中,文档名、文档长度和文档的期满日将显示在框1550中。参考图11(b),如果容器“demo.env”是在文档“demo.txt”的期满日之后打开的,那么,文档将自动地被空数据改写,在框1550中将出现一条消息,表示文档到期。为了从容器中提取文档,通过单击框1550中的文档,然后单击Extract按钮1530来选择该文档。那么,文档将从容器中取出并存储在计算机的指定目录中。如果文档到期,系统将不允许在框1550中选择该文档。
如上所述,按照DS容器的另一些实施例,可以使容器扩大和缩小以容纳多个文档和其它数字对象。可以将新的文档(或其它数字对象)增加到容器中,可以对容器中的现有文档进行更新和删除,可以将多个容器合并。容器中的每个文档可以具有独立的寿命控制和不同的安全等级。
为了提供这一功能,将DS容器模型化为单个文件中的虚拟文件系统。虚拟文件系统是一个作为单个文件出现在外部世界中的存储单元,而其内部表示实际上管理着许多个文件以及它们的控制信息。尽管虚拟文件系统通常包括分层目录结构,但是最好采用平直-单个目录-结构作为DS容器。按照本发明的较佳实施例,DS容器支持以下操作i)创建新的DS容器;ii)将新的文档增加到具有独立寿命控制和安全性的DS容器中;iii)更新DS容器中的现有文档,而不改变寿命控制和安全性;iv)更新DS容器中现有文档的寿命控制或安全性;v)删除DS容器中的现有文档;vi根据DS容器的寿命控制使DS容器中现有文档失效,并从DS容器中删除它;vii)销毁DS容器。
按照本实施例的DS容器包括容器标题(它包括容器的控制信息)和容器中每个文档的文档标题。
参考图10b,按照本实施例的较佳实施,容器标题包括容器名称CNAME801、容器的缺省寿命控制DLC 802、创建容器的日期DC 803、最后改动容器的日期DM 804、最后访问容器的日期DLA 805以及容器中的文档数目806。图10(b)示出一个包括两个文档904.1和904.2的DS容器。每个文档的标题包括文档名称(901.1或901.2)、文档的寿命控制(902.1或902.2)和文档的长度(903.1或903.2)。按照这一实施例,当将文档增加到容器中时采用包含在封壳标题中的DLC802作为缺省寿命控制。DC 803、DM 804和DLA 805字段允许用户通过实施类似于表5(a)视图方法的例程确定创建容器的日期、最后改动容器的日期和最后访问容器的日期。如果不需要这一功能,自然可以从容器标题中省略缺省寿命控制、容器创建、最后改动和最后访问字段。
由于图10b的DS容器是以与图10a以及表4a至5b的DS容器的相似方式实施的,所以,这里将不提供对本实施例编程方法的详细讨论。
参考图12的流程图,为了将文档增加到现有DS容器中,打开现有DS容器(步骤1010),读出容器标题(包括容器名称、缺省寿命控制、创建日期、最后改动日期、最后访问日期和文档数目)。然后,在步骤1030创建被增加新文档的标题,包括文档名、文档的寿命控制和文档长度。然后将文档标题和文档自身添加到容器的末端(步骤1040和1050),对最后访问、最后改动和文档总数字段的值进行更新(步骤1060),把新的值写作新的容器标题。按照图12的流程图,更新的容器改写原始容器。这与表4a至5b的实施例相反,在表4a至5b的情况中,更新的容器是作为一个新文件创建的,原始容器接着被删除。自然,可以将图10b和13的实施例修改为采用表4a至5b的方法(即改写原始容器),反之亦然。
参考图13所示的流程图,为了从图10b的DS容器中提取文档,打开容器(步骤1110),读出容器际题。然后,在步骤1120从容器读出容器中第一个文档的文档标题。在步骤1130,将被提取文档的名称与文档名字段901中的名称进行比较,如果它们相同,那么流程继续到步骤1140,如果它们不相同,那么流程继续到步骤1150。假设文档名字段中的当前文档名与请求文档相同。那么,在步骤1140程序确定该文档的寿命控制是否有效(即当前日期是否在期满日之后)。如果寿命控制是有效的,那么提取当前文档。如果寿命控制是无效的,那么删除该文档。删除文档的说明性代码段如下所示。这里getTotalBytes()的功能从当前文档的文档标题恢复文档长度。
<pre listing-type="program-listing"><![CDATA[public void nullifyDocumentContent(SdeDocumentHeader dh)   throws IOException   {   long bytes ToNullify=dh.getTotalBytes();   for(long 1=0;1<bytesToNullify;1++)   {   write(0);   }    }]]></pre>如果当前文档不是请求的文档,那么在步骤1150程序跳过当前文档的内容到下一文档标题或者封壳的末尾。执行这一功能的说明性代码如下所示<pre listing-type="program-listing"><![CDATA[   public void skipDocumentContent(SdeDocumentHeader dh)   throws IOException   {   long bytesToSkip=dh.getTotalBytes();   for(long 1=0;1<bytesToSkip;1++)   {  int ch=read();   }   }]]></pre>以这种方式,程序读过当前文档,从而当程序返回到步骤1120时它设定为读出容器中下一个文档的文档标题。
已提取文档后,对容器标题中最后访问字段进行更新(步骤1160),更新的容器标题改写容器标题字段801至806(步骤1170),关闭容器(步骤1180)。
表4至5(B)
<pre listing-type="program-listing"><![CDATA[pubiic static int create(String enveiopetilename){{(enveiopetilename=nuil){   return(CREATE_FAIL_BAD_PARAM);}(f,enveiopeExists(enveiopefiiename)){   return(CREATE_FAIL_BAD_PARAM);}try{   FileOutputStream fos=new FileOutputStream(enveloperilename)   DataOutputStream dos=new DataOutputStream(fos);   SdeEnvelopeHeader eh=new SdeEnveiopeHeader();   eh.d name=enveiopetilename;   eh.d_created =new Date();   eh.d_last_modified =new Date();   eh.d_last_accessed =new Date();   eh.write To(dos)   dos.flush();   fos.close();}]]></pre>表4A<pre listing-type="program-listing"><![CDATA[public static int addDocument(   String enveiopefilename,   String documenttilename,   Date expires}   If(envelopefilename=null‖   documentfilename=null‖   expires=null)   {   return(ADD_FAIL_BAD_PARAM);   }   if(envelopeExists(enveiopefilename)=faise)   {   create(enveiopefiiename);   }   if(documentExists(documentfiiename)=false)   {   return(ADD_FAIL_BAD_PARAM);   }   try   {   FileInputStream fis=new FilelnputStream(enveiopefiiename);   DataInputStream dis=new DatalnputStream(fis);   FiieOutputStream fos=new FileOutputStream(envelopefiiename+″.tmp″);   DataOutputStream dos=new DataOutputStream(fos);   SdeEnveiopeHeader eh=new SdeEnvelopeHeader();   eh.readFrom(dis);   eh.d_last_modified=new Date();   eh.d_total_documents++;   eh.writeTo(dos);   File file_doc=new File(documentfilename);   long length=fiie_doc.length();   FileInputStream fis_doc=new FileinputStream(file_doc);   SdeDocumentHeader dh=new SdeDocumentHeader();dh.d_name=documenttilename   dh.d_expires=expires;   dh.d_total_bytes=iength;   dh.write To(dos);   while(true)   {   int ch=fis_doc.read();   if(ch=-1)   break;   ch^=65;   dos.write(ch);   }   fis_doc.close();   dos.flush();   fos.close();   fis.close();   File file_orig=new File(envelopefilename);   file_orig.delete();   File file_new=new File(enveiopefilename+″.tmp″);   file_new.rename To(file_orig);  }  catch(IOException ioe)  {   return(ADD_FAIL_IOEXCEPTION);  }  return(ADD_OK);}]]></pre>表4B<pre listing-type="program-listing"><![CDATA[  class SdeEnvelopeHeader  {   public Stringd_name =nuil;   public Date d_created =null;   public Date d_last_modified=nuil;   public Date d_last_accessed=null;   public long d_total_documents =0;   public boolean write To(DataOutputStream dos)   throws IOException  {   dos.writeUTF(d_name);   dos.writeLong(d_created.get Time());   dos.writeLong(d_last_modified.getTimet));   dos.writeLong(d_last_accessed.getTimet));   dos.writeLong(d_total_documents);   return(true)  }  pubiic boolean readFrom(DataInputStream dis)   throws IOException{   d_name=dis.readUTF();   long c=dis.readLong();   d_created=new Date(c);   long Im=dis.readLong();   d_last_modified=new Date(lm);   long la=dis.readLong();   d_last_accessed=new Date(la);   d_total_documents=dis.readLong();return(true)  }   }]]></pre>表4C<pre listing-type="program-listing"><![CDATA[class SdeDocumentHeader{   pubiic Stringd_name =nuil   public Date d_expires=nuil;   public long d_totai_bytes=0;   pubiic booiean write To(DataOutputStream dos)   throws IOException   {   dos.writeUTF(d_name);   dos.writeLong(d_expires.getTime());   dos.writeLong(d_total_bytes);   return(true);   }   pubiic boolean readFrom(DataInputStream dis)   throws IOException   {   d_name=dis.readUTF();   long e=dis.readLong();   d_expires=new Date(e);   d_total_bytes=dis.readLong();   return(true);   }}]]></pre>表4D<pre listing-type="program-listing"><![CDATA[   public static int VIEW_OK=0;   public static int VIEW_FAIL_BAD_PARAM=1;   public static int VIEW_FAIL_IOEXCEPTION=2;   public static int view(String envelopefilename.PrintStream ps)   {   if(enveiopefilename=null‖ps=null)   {   return(VIEW_FAIL_BAD_PARAM);   }   if(enveiopeExists(envelopefiiename)=false)   {   return(EXTRACT_FAIL_BAD_PARAM)   }   try   {   FiieinputStream fis=new FiieinputStream(enveiopefiiename);   DataInputStream dis=new DatainputStream(fis);   SdeEnvelopeHeader eh=new SdeEnveiopeHeader();   eh.readFrom(dis);   ps.println(″Envelope+eh.d_name+.″);   ps.println(″Created″+eh.d_created.toString());   ps.println(″Last modified″+eh.d_last_modified.toString());   ps.println(″Last accessed″+eh.d_last_accessed.toString());   ps.println(″Contains″+eh.d_total_documents+″document(s).″);  fis.close();}  catch(IOException ioe)  {   return(VIEW_FAIL_IOEXCEPTION);  }  return(VIEW_OK);   }]]></pre>表5A<pre listing-type="program-listing"><![CDATA[public static int extractDocument(String enveiopefilename.String documenttilename)   {  if(envelopefilename=null i documenttilename=nuil)  {  return(EXTRACT_FAIL_BAD_PARAM);  }  if(enveiopeExists(envelopefilename)=false)  {  return(EXTRACT_FAIL_BAD_PARAM);  }  booiean vaiid =true;  intinvalid_reason =EXTRACT_FAIL_UNKNOWN;  try  {   FilelnputStream fis=newFilelnputStream(envelopefilename);   DataInputStream dis=new DataInputStream(fis);   SdeEnvelopeHeader eh=new SdeEnveiopeHeader();   eh.readFrom(dis);   SdeDocumentHeader dh=new SdeDocumentHeader();   dh.readFrom(dis);   if(dh.d_name.equalsIgnoreCase(documentfilename)=false)   {   valid=false;   nvalid_reason=EXTRACT_FAIL_NOT_FOUND   }   if(dh.d_expires.before(new Date()))   {   valid=false;   invalid_reason=EXTRACT_FAIL_INVALID;   }   File file_doc=new File(documentfilename);   if(file_doc.exists())   {   file_doc=new File(documenttilename+″.x″);   }   FileOutputStrearn fos_doc=null;   If(valid)   {   fos_doc=new FileOurputStream(file_doc);   }   for(long 1=0;1<dh.d_total_bytes;i-)   int ch=dis.read();   if(valid)   {   ch^=65;   fos_doc.write(ch);}   if(valid)   {   fos_doc.close();   }    fis.close();  }  catch(IOException ioe)  {   return(EXTRACT_FAIL_IOEXCEPTION);  }  if(valid)  {  return(EXTRACT_OK);  }  else  {   return(invalid_reason);  }  }]]></pre>表5B然而,应当注意以上所示的示范实施例以较为简单的图形用户接口、简单的加密技术和包括期满日的寿命控制将基于Java流的方法提供给虚拟容器,应当注意本发明包括较宽的附加实施方案的排列,它们可以是较为简单或者是较为复杂的。在这方面,用户接口可以包括更复杂的GUI或者没有图形的简单命令行接口。同样,虚拟容器也可以利用Java串行机制实现或是可以利用另一种语言,如C++一起实现。此外,可以将寿命控制修改为多次提取文档或多次对文档进行修改的功能。此外,可以将寿命控制用于在规定期限后将文档转变为只读文档或者防止文档被复制或打印。
虚拟容器的因特网商务应用按照本发明的另一实施例,提供一个采用虚拟容器的因特网商务系统。按照本实施例,希望在因特网上出售电子化可传输产品的一方利用容器创建实用工具将产品放置到虚拟容器中,容器创建实用工具对产品进行加密和设定产品的寿命控制。在这方面,出售方希望允许可能的买主观看产品或者在有限的试用期内使用该产品,如果没有购买则在这一试用期后销毁该产品。希望在购买产品前对产品进行看样的可能买主从出售方获得容器的复制品以及容器开启实用工具。容器开启实用工具允许买主观看或使用产品同时将产品维持在虚拟容器内。然而,能够将容器开启实用工具设置成防止用户打印该产品(或其任何部分)、复制该产品(或其任何部分)以及修改该产品,如果买主试图不使用容器开启工具观看产品,他/她将不能对产品解密。在任何情况中,一旦产品的寿命控制变为无效(即在出售方规定的时限之后),采用容器开启工具打开容器的任何企图都将导致产品毁坏。应当注意产品可以是能够以数字形式发送的任何形式的电子媒体,包括例如文档、照相、图象和程序。
按照本实施例的另一方面,买主可以在寿命控制期满日之前例如通过将他/她的信用卡信息发送给售主而购买该产品。在收到和/或核实支付信息后,售主将购买密钥发送给买主。容器开启工具被设置成能识别购买密钥(该密钥最好是仅针对发给该特定买主的产品的特定情况),如果购买密钥是有效的,允许买主从容器中提取产品。
使用虚拟容器和嵌入式可执行模块的软件元件在上述的每个示范实施例中,以应用专用程序已经实现自销毁文档,从而用来执行自销毁WordTM文档的程序不用于执行自销毁ExcelTM文档的程序。为了避免这一可重复(再)开发过程,自销毁文档,或在这方面的虚拟容器系统能够作为软件元件来实现。软件元件是易于再利用的软件单元,通常提供一种简单服务。
元件对象模型(COM)是软件元件技术的微软(Microsoft)标准。它定义易于再利用的封装软件的标准。通常的COM元件包括两大类内容作为一组方法(功能)实行的元件的功能性和有关该元件及其功能性的描述信息。总起来说,这一内容被称为元件接口。应当注意采用的这一术语不同于术语“用户接口”。用户接口通常是窗口、菜单、按钮和允许用户与应用程序功能交互作用的图形显示。然而,“接口”更广泛地是指进入软件(方法或功能)单元的入口点。
能够采用COM元件来执行用户接口元件,如按钮和清单。也能够采用它们来提供不用用户接口的服务。例如,COM元件可以提供计算正弦和余弦函数的数学功能。
尽管元件与对象之间存在微妙的技术差别,但是它们都代表两个非常相似的概念。照此,本文采用的术语与贸易出版和技术参考材料的惯用语相一致,可以互换。
此外,术语控制通常用于描述具有与之相关联的用户接口的元件。具体地说,微软公司采用术语ActiveX Control来描述通常具有用户接口的特定一类COM元件。当采用COM元件扩展现有应用程序的功能时,将该元件说成是嵌入在应用程序的文档中。通常将这种元件称为嵌入对象。在这方面,我们注意到Word97TM、ExcelTM、Outlook98TM各自都包括Visual Basic应用程序至COM对象文件库的支持程序。
采用嵌入对象技术实现应用程序扩展通常需要将COM元件安装到文档作者的计算机中。另外,接收文档复制件的任何用户通常也必须将COM元件安装到他或她的计算机中,以实现扩展功能。
通过广泛努力,虚拟容器的COM元件可以按照如下所述来实现。
1.首先,指定元件的接口。接口描述元件提供的每一种服务。在SDE元件的情况中,服务可以包括CreateEnvelope、AddDocumentToEnvelope和ExtractDocumentFromEnvelope。
2.利用诸如C++、Java和Visual Basic的编程语音实现元件的每一个服务。
3.利用编程语音的开发工具创建COM元件。
4.将COM元件安装到用户的工作站上。实现调用元件服务的少量过程需求。
然而,应当注意这里描述了微软公司的COM元件标准,也可以采用其它制造商分发的软件元件标准。
虽然对目前认为是本发明较佳实施例作了描述,但是,本领域的专业人员在不偏离本发明精神的条件下能够对其作出改变和改进。希望所有这些改变都落在本发明权利要求的范围内。
权利要求
1.一种创建自毁文档的方法,其特征在于所述方法包括以下步骤创建一可执行模块,该模块指令计算机改写和/或删除所述可执行模块附加到其上的文档;将所述可执行模块附加到所述文档上。
2.如权利要求1所述的方法,其特征在于所述可执行模块是可执行的代码。
3.如权利要求1所述的方法,其特征在于所述可执行模块是可执行的程序。
4.如权利要求1所述的方法,其特征在于所述可执行模块是宏指令。
5.如权利要求1所述的方法,其特征在于所述方法进一步包括在打开所述文档时执行所述可执行模块的步骤。
6.一种自毁电子邮件发报系统,其特征在于所述系统包括可执行模块,该模块配置成指令计算机删除所述可执行模块附加到其上的报文;电子邮件发报系统,所述电子邮件发报系统配置成创建一电子邮件报文并发送所述电子邮件报文,所述电子邮件发报系统在发送前将所述可执行模块附加到所述电子邮件报文上。
7.如权利要求6所述的系统,其特征在于所述可执行模块是可执行的代码。
8.如权利要求6所述的系统,其特征在于所述可执行模块是可执行的程序。
9.如权利要求6所述的系统,其特征在于所述可执行模块是宏指令。
10.如权利要求6所述的系统,其特征在于所述可执行模块配置成采用空字符改写所述消息。
11.如权利要求6所述的系统,其特征在于所述可执行模块配置成指令所述计算机在出现预定条件时删除所述电子邮件报文。
12.如权利要求11所述的系统,其特征在于所述预定条件是指日期。
13.如权利要求6所述的系统,其特征在于所述可执行模块配置成在打开附加所述可执行模块的所述电子邮件时执行。
14.如权利要求6所述的系统,其特征在于所述可执行模块配置成在打开附加所述可执行模块的所述电子邮件时开始执行,如果满足预定条件在所述执行过程期间所述可执行模块删除所述报文。
15.如权利要求6所述的系统,其特征在于所述电子邮件报文是电子邮件报文附件。
16.如权利要求15所述的系统,其特征在于所述可执行模块配置成指令所述计算机在出现预定条件时删除所述电子邮件报文附件。
17.如权利要求16所述的系统,其特征在于所述预定条件是指所述电子邮件报文的打印、复制或转送。
18.如权利要求1所述的方法,其特征在于所述文档是指加密文档,所述可执行模块配置成指令所述计算机若满足预定条件则对所述文档进行解密,若不满足所述预定条件则删除所述文档。
19.如权利要求6所述的方法,其特征在于所述文档是指加密文档,所述可执行模块配置成指令所述计算机若满足预定条件则对所述报文进行解密,若不满足所述预定条件则删除所述报文。
20.一种创建含有数字对象的虚拟容器的方法,其特征在于所述方法包括以下步骤创建一虚拟容器,所述虚拟容器驻留在计算机电子存储媒体的邻接位置中,所述虚拟容器包括标题部分和数字对象部分;选择插入到所述虚拟容器中的数字对象;将加密技术运用于所述数字对象,以创建一加密数字对象;选择所述数字对象的期满日;将所述期满日的信息指示写入所述虚拟容器的所述标题部分。
21.一种从虚拟容器提取文档的方法,其特征在于所述方法包括以下步骤从虚拟容器的标题部分读出期满日的信息指示,所述虚拟容器驻留在计算机电子存储媒体的邻接位置中,所述虚拟容器包括标题部分和数字对象部分,所述数字对象部分包括加密数字对象;根据所述信息确定所述电子对象是否到期;如果所述电子对象到期,用空数据改写所述虚拟容器中的数字对象部分;如果所述数字对象不到期,从所述数字对象部分读出所述数字对象并将加密技术运用于所述数字对象。
22.一种虚拟容器系统,其特征在于所述系统包括一容器创建实用工具,所述容器创建实用工具创建一虚拟容器,它驻留在计算机电子存储媒体的邻接位置中,这里,所述虚拟容器包括标题部分和数字对象部分,容器开启实用工具接收用户的数字对象选择和期满日选择,容器创建工具将加密技术运用于所选数字对象上以创建加密数字对象并将所述加密数字对象写入到所述虚拟容器的所述数字对象部分中,容器创建工具将所述期满日的信息指示写入到所述虚拟容器的所述标题部分中;容器开启实用工具,所述容器开启实用工具从所述虚拟容器的所标题部分读出所述期满日的指示信息,所述容器开启工具根据所述信息确定所述电子对象是否到期,如果所述电子对象到期,所述容器开启工具用零数据改写所述虚拟容器中的数字对象部分;如果所述数字对象不到期,所述容器开启工具从所述数字对象部分读出所述数字对象并将加密技术运用于所述数字对象。
23.一种创建虚拟容器和从虚拟容器中提取数字对象的方法,其特征在于创建所述虚拟容器的方法包括以下步骤创建一虚拟容器,所述虚拟容器驻留在计算机电子存储媒体的邻接位置中,所述虚拟容器包括标题部分和数字对象部分;选择插入到所述虚拟容器中的数字对象;将加密技术运用于所述数字对象,以创建一加密数字对象;将所述加密数字对象写入所述数字对象部分;选择所述数字对象的期满日;将所述期满日的指示信息写入所述虚拟容器的所述标题部分;从所述虚拟容器中提取文档的方法包括以下步骤从虚拟容器的标题部分读出期满日的指示信息;根据所述信息确定所述电子对象是否到期;如果所述电子对象到期,用空数据改写所述虚拟容器中的数字对象部分;如果所述数字对象不到期,从所述数字对象部分读出所述数字对象并将加密技术运用于所述数字对象。
24.如权利要求20所述的方法,其特征在于创建虚拟容器的所述步骤包括创建容器标题和数字对象标题的步骤,所述容器标题包括涉及所述容器的信息,如容器名称,所述数字对象标题包括涉及所述数字对象的信息,如数字对象名称。
25.如权利要求24所述的方法,其特征在于写入所述期满日的指示信息的所述步骤包括把所述信息写入所述容器标题中。
26.如权利要求24所述的方法,其特征在于写入所述期满日的指示信息的所述步骤包括把所述信息写入所述数字对象标题中。
27.如权利要求24所述的方法,其特征在于选择插入到所述虚拟容器中的数字对象的步骤包括多个选择插入到所述虚拟容器中的数字对象;运用加密技术的步骤包括将加密技术运用于所述多个数字对象中的每一个;将所述加密数字对象写入到所述数字对象部分中的步骤包括将每个所述加密数字对象写入到所述数字对象部分中;选择期满日的步骤包括选择多个数字对象中每一个的期满日;以及写入信息的步骤包括将每一个数字对象的期满日的信息指示写入到各自的数字对象标题中。
28.如权利要求23所述的方法,其特征在于创建虚拟容器的所述步骤包括创建容器标题和数字对象标题的步骤,所述容器标题包括涉及所述容器的信息,如容器名称,所述数字对象标题包括涉及所述数字对象的信息,如数字对象名称。
29.如权利要求28所述的方法,其特征在于写入所述期满日的指示信息的所述步骤包括把所述信息写入所述容器标题中。
30.如权利要求28所述的方法,其特征在于写入所述期满日的指示信息的所述步骤包括把所述信息写入所述数字对象标题中。
31.如权利要求2所述的方法,其特征在于选择插入到所述虚拟容器中的数字对象的步骤包括选择多个插入到所述虚拟容器中的数字对象;运用加密技术的步骤包括将加密技术运用于所述多个数字对象中的每一个;将所述加密数字对象写入到所述数字对象部分中的步骤包括将每个所述加密数字对象写入到所述数字对象部分中;选择期满日的步骤包括选择多个数字对象中每一个的期满日;以及写入信息的步骤包括将每一个数字对象的期满日的信息指示写入到各自的数字对象标题中。
32.一种将可销毁数字对象发送给收件人的方法,其特征在于所述方法包括以下步骤创建一虚拟容器,所述虚拟容器驻留在计算机电子存储媒体的邻接位置中,所述虚拟容器包括标题部分和数字对象部分;选择插入到所述虚拟容器中的数字对象;将加密技术运用于所述数字对象,以创建一加密数字对象;将所述加密数字对象写入到所述数字对象部分中;选择所述数字对象的期满日;将所述期满日的信息指示写入所述虚拟容器的所述标题部分,将所述虚拟容器和容器开启实用工具发送给收件人,这里,所述容器开启实用工具在被收件人调用时从虚拟容器的标题部分读出期满日的指示信息,根据所述信息确定所述电子对象是否到期,如果所述电子对象到期,用空数据改写所述虚拟容器中的数字对象部分,如果所述数字对象不到期,从所述数字对象部分读出所述数字对象并将加密技术运用于所述数字对象。
33.如权利要求32所述的方法,其特征在于所述虚拟容器是经因特网发送的。
34.如权利要求27所述的方法,其特征在于所述标题部分包括所述容器标题部分和所述数字对象部分,每个数字对象在所述虚拟容器中处于与其各自数字对象标题相邻的位置。
35.如权利要求31所述的方法,其特征在于所述标题部分包括所述容器标题部分和所述数字对象部分,每个数字对象在所述虚拟容器中处于与其各自数字对象相邻的位置。
36.如权利要求21所述的方法,其特征在于所述数字对象是文档。
37.如权利要求22所述的方法,其特征在于所述数字对象是文档。
38.如权利要求23所述的方法,其特征在于所述数字对象是文档。
39.如权利要求32所述的方法,其特征在于所述数字对象是文档。
40.如权利要求21所述的方法,其特征在于所述数字对象是程序。
41.如权利要求22所述的方法,其特征在于所述数字对象是程序。
42.如权利要求23所述的方法,其特征在于所述数字对象是程序。
43.如权利要求32所述的方法,其特征在于所述数字对象是程序。
全文摘要
提供了一种自毁文档或电子邮件发报系统,该系统通过把宏或病毒附加到文档或电子邮件报文,以在预定的时间自动地销毁文档或电子邮件报文。产生(220)宏,并在它产生时把它附加(230)到诸如电子邮件报文(280)或文档(270)等文件。宏包含可执行代码或可执行程序的一部分,它指令计算机在所需的时间改写和/或删除附加了病毒的文件。
文档编号G06Q10/00GK1229489SQ98800856
公开日1999年9月22日 申请日期1998年6月16日 优先权日1997年6月17日
发明者H·R·乌德尔, S·D·贝克, C·S·卡普尔, G·M·舍曼, W·里斯 申请人:珀杜法尔玛Lp公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1