專利名稱:自毀文檔和電子郵件發報系統的制作方法
技術領域:
本發明涉及以電子方式產生文檔的領域,包括電子郵件(“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.″& Chr(13) &″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″& daysTilDestruct()&″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公司