專利名稱:自毀文檔和電子郵件發(fā)報(bào)系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及以電子方式產(chǎn)生文檔的領(lǐng)域,包括電子郵件(“e-mail”)發(fā)報(bào),也涉及文檔保存和刪除的領(lǐng)域。
背景技術(shù):
電子郵件發(fā)報(bào)系統(tǒng)被全世界的商行和個(gè)人所廣泛使用。電子郵件系統(tǒng)還使用戶可把電子報(bào)文(message)發(fā)送到其它用戶并接收來自其它用戶的電子報(bào)文。電子郵件系統(tǒng)可構(gòu)成為連到局域網(wǎng)(LAN)的用戶提供發(fā)報(bào)服務(wù),也可構(gòu)成使用戶經(jīng)由諸如因特網(wǎng)等外部網(wǎng)絡(luò)往返于LAN外部的用戶發(fā)送/接收?qǐng)?bào)文。電子郵件系統(tǒng)還使用戶可保存、拷貝和轉(zhuǎn)送在電子郵件系統(tǒng)上接收到的報(bào)文。
電子郵件系統(tǒng)使用戶可容易地保存、拷貝和轉(zhuǎn)送報(bào)文,這樣帶來了妨礙文檔保存政策的不想要的結(jié)果。通常,由商行來實(shí)行文檔保存政策,以保證把由商行產(chǎn)生或接收到的文檔保存規(guī)定的時(shí)間然后銷毀。此外,可對(duì)不同類型的文檔規(guī)定不同的文檔保存周期。文檔保存政策的一個(gè)對(duì)象是為保存和銷毀文檔提供一種系統(tǒng)方法,從而商行可從給定的時(shí)間周期中大致識(shí)別哪些類型的文檔仍舊存在。
有效的文檔保存政策在訴訟角度中也有價(jià)值。在該角度下,商行具有與文檔的保存和銷毀有關(guān)的堅(jiān)定政策且商行實(shí)行該政策是重要的。例如,如果商行的文檔保存政策規(guī)定要把信件保留三年的周期,并堅(jiān)決地履行這個(gè)政策,則不太容易受到對(duì)銷毀有5年之久的特定信件的指控,這是因?yàn)榇诵偶?duì)商行的訴訟身份是有害的。此外,如果沒有堅(jiān)決地履行文檔保存政策而只丟棄特定時(shí)間周期的一些文檔,則剩余的文檔將對(duì)在此時(shí)間內(nèi)發(fā)生的事件產(chǎn)生不完全或不準(zhǔn)確的概念是可能的。
對(duì)計(jì)算機(jī)文件堅(jiān)持文檔保存政策的系統(tǒng)是眾所周知的。通常,這些系統(tǒng)周期性地掃描網(wǎng)絡(luò)中的文件并刪除在特定日期前產(chǎn)生的文件。然而,由于這種系統(tǒng)在網(wǎng)絡(luò)上進(jìn)行操作,所以它們不可能刪除存儲(chǔ)在個(gè)人計(jì)算機(jī)的硬驅(qū)上的文件。為存取這些文件,在每個(gè)個(gè)人計(jì)算機(jī)上安裝了文檔保存程序。然而,即使在每個(gè)個(gè)人計(jì)算機(jī)上安裝有文檔保存系統(tǒng),該系統(tǒng)仍舊不能刪除存儲(chǔ)在軟盤或其它外部媒體上的文件。此外,這些系統(tǒng)不能刪除已經(jīng)由電子郵件轉(zhuǎn)移到網(wǎng)絡(luò)外部的計(jì)算機(jī)的文件。于是,例如,常規(guī)的文檔保存系統(tǒng)不能刪除已轉(zhuǎn)移到雇員的家庭計(jì)算機(jī)或膝上型計(jì)算機(jī)或第三方的文件。
發(fā)明內(nèi)容
依據(jù)本發(fā)明的第一實(shí)施例,提供了一種自毀文檔和電子郵件發(fā)報(bào)系統(tǒng),該系統(tǒng)通過把諸如“病毒”等可執(zhí)行模塊附加到文檔或電子郵件報(bào)文以在預(yù)定時(shí)間自動(dòng)地銷毀文檔或電子郵件報(bào)文。
計(jì)算機(jī)病毒是眾所周知的。一般,計(jì)算機(jī)病毒是本身附加到宿主文件的可執(zhí)行代碼或程序的一部分。例如,“附加病毒”通過把自己附加到主程序的末尾并使主程序在執(zhí)行主程序前執(zhí)行病毒代碼來進(jìn)行操作。相反,“前置病毒”把自己附加到主程序的開始。其它類型的病毒位于主程序的內(nèi)部。知道另一類病毒是“宏”病毒。這些病毒是嵌入文本文檔中的宏,這些病毒可構(gòu)成在每當(dāng)打開、產(chǎn)生或保存文檔時(shí)執(zhí)行。通常,術(shù)語特洛伊馬指屬于其主文件或程序且不移動(dòng)到其它文件或程序的病毒。
依據(jù)本發(fā)明的第一實(shí)施例,把具有特洛伊馬形式可執(zhí)行模塊在文件(諸如電子郵件報(bào)文或文件)創(chuàng)建時(shí)附加到該文件。可執(zhí)行模塊包含可執(zhí)行代碼或可執(zhí)行程序的一部分,它指令計(jì)算機(jī)在所需的時(shí)間改寫和/或刪除附加了可執(zhí)行模塊的文件。這樣,可執(zhí)行模塊對(duì)文檔或電子郵件報(bào)文的壽命加以限制。由于把可執(zhí)行模塊附加到文件,所以即使在把文件拷貝、轉(zhuǎn)送或保存到盤片或磁帶驅(qū)動(dòng)器時(shí),可執(zhí)行模塊也將隨文件移動(dòng)。
依據(jù)本發(fā)明第一實(shí)施例的另一個(gè)方面,每當(dāng)打開附加了可執(zhí)行模塊的文件時(shí)就執(zhí)行可執(zhí)行模塊??蓤?zhí)行模塊確定是否已碰到文件刪除的先決條件。如果碰到先決條件,則可執(zhí)行模塊指令計(jì)算機(jī)以零數(shù)據(jù)改寫文件然后保存、關(guān)閉或刪除該文件。
這樣,本發(fā)明提供了超過已有技術(shù)系統(tǒng)的許多優(yōu)點(diǎn)。例如,由于把可執(zhí)行模塊附加到文件并在打開文件時(shí)執(zhí)行,所以依據(jù)本發(fā)明的系統(tǒng)即使在已把文件存儲(chǔ)在諸如軟盤等外部媒體或非網(wǎng)絡(luò)計(jì)算機(jī)上時(shí)也可堅(jiān)持文檔保存政策。這是因?yàn)榭蓤?zhí)行模塊隨文件移動(dòng)且在無論何時(shí)何地每當(dāng)打開文件時(shí)就執(zhí)行。
依據(jù)本發(fā)明的第二實(shí)施例,提供了一種自毀電子郵件發(fā)報(bào)系統(tǒng),該系統(tǒng)把可執(zhí)行模塊自動(dòng)地附加到每個(gè)所產(chǎn)生的電子郵件報(bào)文或電子郵件報(bào)文附件??蓤?zhí)行模塊包含可執(zhí)行代碼或可執(zhí)行程序的一部分,它指令計(jì)算機(jī)在所需的時(shí)間改寫和/或刪除該可執(zhí)行模塊附加到的報(bào)文(和/或報(bào)文附件)。當(dāng)把報(bào)文傳輸?shù)狡涞刂窌r(shí),可執(zhí)行模塊隨報(bào)文一起移動(dòng),這是因?yàn)榭蓤?zhí)行模塊被附加到報(bào)文上。此外,即使在把報(bào)文拷貝、轉(zhuǎn)送到另一個(gè)地址或保存到盤片或其它外部媒體時(shí),可執(zhí)行模塊也保持附加于該報(bào)文。
依據(jù)本發(fā)明的第三實(shí)施例,一種文檔安全系統(tǒng)包括其中“放置”有一個(gè)或多個(gè)數(shù)字對(duì)象(object)的虛擬容器。這樣,術(shù)語“數(shù)字對(duì)象”被廣泛地使用,它包括文檔(諸如電子表格、圖表/圖形、字處理器文檔、ASCII文本文件、圖像和其它數(shù)據(jù)文件)、程序以及可被存儲(chǔ)在計(jì)算機(jī)上的任何東西。文檔安全系統(tǒng)包括容器創(chuàng)建工具和容器開啟工具。以在計(jì)算機(jī)上執(zhí)行的一個(gè)或多個(gè)軟件程序來實(shí)行容器創(chuàng)建工具和容器開啟工具。容器開啟工具使用戶可對(duì)容器中數(shù)字對(duì)象的有效壽命加以限制。例如,這些“壽命控制”可包括截止日期、截止日期和時(shí)間、文檔可被打開的固定次數(shù)或其它限制。在由容器開啟工具來打開該容器時(shí),容器開啟工具檢查壽命控制。如果它們有效,則可訪問包含在容器內(nèi)的數(shù)字對(duì)象以使用戶顯示或執(zhí)行。然而,如果壽命控制無效,則容器開啟工具將立即銷毀該數(shù)字對(duì)象。
包括容器創(chuàng)建工具和容器開啟工具的文檔安全系統(tǒng)的一個(gè)優(yōu)點(diǎn)在于,在某些環(huán)境下,它與包含可執(zhí)行模塊的自毀文檔相比,為壽命控制提供了更穩(wěn)健的強(qiáng)制力。這是因?yàn)楫?dāng)前字處理和電子表格程序執(zhí)行可執(zhí)行模塊的能力隨產(chǎn)品的不同而變化很大。因此,例如,如果打開包括可由Microsoft WordTM執(zhí)行的可執(zhí)行模塊的自毀文檔則該文檔將不能自毀,例如一個(gè)簡(jiǎn)單的ASCII文件沒有構(gòu)成識(shí)別和執(zhí)行可執(zhí)行模塊。相反,由此文檔安全系統(tǒng),可把文檔固定在由容器開啟工具來打開的容器中,容器開啟工具在使用時(shí)可對(duì)容器中的任何文檔執(zhí)行壽命控制,而文檔的類型無關(guān)。
依據(jù)本發(fā)明第三實(shí)施例的文檔安全系統(tǒng)的另一個(gè)方面,容器內(nèi)的每個(gè)數(shù)字對(duì)象可具有獨(dú)立的壽命控制。依據(jù)此特征,當(dāng)容器內(nèi)的單個(gè)物體期滿時(shí),可銷毀該物體,而其它物體保持完整。
依據(jù)文檔安全系統(tǒng)的再一個(gè)實(shí)施例,數(shù)字對(duì)象是依據(jù)本發(fā)明的第一或第二實(shí)施例產(chǎn)生的自毀文檔。
依據(jù)本發(fā)明的又一個(gè)實(shí)施例,可抵擋希望破壞該安全系統(tǒng)的用戶來保護(hù)容器、其內(nèi)容及其壽命控制。通過使用加密技術(shù)來實(shí)行此保護(hù)。尤其是,使容器創(chuàng)建工具構(gòu)成對(duì)容器內(nèi)的物體加密,并使容器開啟工具構(gòu)成對(duì)物體解密。這樣,如果用戶打開一個(gè)物體而不利用容器開啟工具,則該物體將不可讀。
依據(jù)第一和第二實(shí)施例的另一個(gè)方面,通過可執(zhí)行模塊或通過其它工具對(duì)自毀文檔或電子郵件報(bào)文進(jìn)行加密,使可執(zhí)行模塊構(gòu)成只在文檔或電子郵件報(bào)文的壽命還未期滿時(shí)對(duì)文檔和電子郵件報(bào)文進(jìn)行解密。
依據(jù)本發(fā)明的另一個(gè)實(shí)施例,通過把多個(gè)可執(zhí)行模塊嵌入文檔或電子郵件報(bào)文來產(chǎn)生自毀文檔,其中可通過不同的字處理或電子郵件系統(tǒng)來執(zhí)行每個(gè)模塊。例如,一個(gè)文檔可包括可由第一系統(tǒng)執(zhí)行的第一模塊以及由第二系統(tǒng)執(zhí)行的第二模塊。文檔本身可以是屬于任一個(gè)系統(tǒng)的文檔。依據(jù)此實(shí)施例,將執(zhí)行對(duì)文檔的壽命控制,而不管該文檔是在第一系統(tǒng)還是在第二系統(tǒng)中打開。
依據(jù)本發(fā)明的再一個(gè)實(shí)施例,提供了一種利用虛擬容器的因特網(wǎng)商務(wù)系統(tǒng)。依據(jù)此實(shí)施例,希望在因特網(wǎng)上銷售可以電子方式傳輸?shù)漠a(chǎn)品的一方使用對(duì)產(chǎn)品加密并對(duì)產(chǎn)品設(shè)定時(shí)間控制的容器創(chuàng)建工具把產(chǎn)品放置在虛擬容器內(nèi)。希望在購買產(chǎn)品前對(duì)產(chǎn)品看樣的產(chǎn)品潛在購買者從銷售者處獲得容器以及容器開啟工具的拷貝。容器開啟工具使?jié)撛谫徺I者只能在預(yù)選的截止日期前才能觀看和使用產(chǎn)品。在此實(shí)施例中,容器開啟工具不能使用戶從虛擬容器中除去該產(chǎn)品。依據(jù)此實(shí)施例的一個(gè)較佳方面,如果在截止日期后打開該容器,則由容器開啟工具來刪除該產(chǎn)品。依據(jù)此實(shí)施例的另一個(gè)方面,如果銷售者在截止日期前接收到產(chǎn)品的付款,則銷售者將把獨(dú)有的密鑰傳輸給購買者。可使容器開啟工具構(gòu)成在接收到此密鑰時(shí)從容器中釋放產(chǎn)品。
附圖概述
圖1示出可實(shí)行本發(fā)明的示意的已有技術(shù)環(huán)境。
圖2(a)和2(b)示出依據(jù)本發(fā)明的電子郵件報(bào)文,它們分別包括pre-pending和附加病毒。
圖3是用于依據(jù)本發(fā)明的一個(gè)示意實(shí)施例產(chǎn)生自毀電子郵件報(bào)文的示意方法的流程圖。
圖4是把宏病毒嵌入圖3的自毀電子郵件報(bào)文中的流程圖。
圖5(a)到5(c)示出用于依據(jù)本發(fā)明一個(gè)實(shí)施例的自毀文檔的圖形用戶界面,它是為Microsoft ExcelTM文檔而實(shí)行的。
圖6(a)到6(c)示出用于依據(jù)本發(fā)明一個(gè)實(shí)施例的自毀文檔的圖形用戶界面,它是為Microsoft WordTM文檔而實(shí)行的。
圖7(a)到7(e)示出用于依據(jù)本發(fā)明一個(gè)實(shí)施例的自毀電子郵件報(bào)文的圖形用戶界面,它是為Microsoft OutlookTM而實(shí)行的。
圖8(a)示出依據(jù)本發(fā)明一個(gè)實(shí)施例的文檔組虛擬容器。
圖8(b)示出依據(jù)本發(fā)明一個(gè)實(shí)施例的虛擬容器代理。
圖9(a)和9(b)示出本發(fā)明的文檔組虛擬容器的另一個(gè)實(shí)施例。
圖10(a)示出構(gòu)成保存單個(gè)文檔的文檔組容器的示意標(biāo)題格式。
圖10(b)示出構(gòu)成保存多個(gè)文檔的文檔組容器的示意標(biāo)題格式。
圖11示出用于容器創(chuàng)建工具和容器開啟工具的圖形用戶接口。
圖12是用于把文檔加到圖10(b)的文檔組容器的示意流程圖。
圖13是用于從圖10(b)的文檔組容器中提取文檔的示意流程圖。
本發(fā)明的較佳實(shí)施方式圖1示出可利用本發(fā)明的示意的已有技術(shù)環(huán)境。局域網(wǎng)1(LAN 1)包括多個(gè)辦公計(jì)算機(jī)10.1-10.6(以下集中叫做計(jì)算機(jī)10)和服務(wù)器20。每個(gè)計(jì)算機(jī)10包括各個(gè)主存儲(chǔ)設(shè)備12(諸如硬驅(qū))和各個(gè)輔存儲(chǔ)設(shè)備14(諸如軟盤或CD Rom驅(qū)動(dòng)器)。服務(wù)器20同樣包括主網(wǎng)絡(luò)存儲(chǔ)設(shè)備22(諸如硬驅(qū))和輔網(wǎng)絡(luò)存儲(chǔ)設(shè)備24(諸如磁帶或CD Rom驅(qū)動(dòng)器)。主和輔網(wǎng)絡(luò)存儲(chǔ)設(shè)備22、24上的數(shù)據(jù)是共享的,它可被所有的計(jì)算機(jī)10所訪問。相反,每個(gè)計(jì)算機(jī)10的主和輔存儲(chǔ)設(shè)備12、14上的數(shù)據(jù)是私有的,它只能被其各自的計(jì)算機(jī)10所訪問。服務(wù)器20經(jīng)由傳輸線50對(duì)諸如家庭計(jì)算機(jī)40等網(wǎng)絡(luò)外的計(jì)算機(jī)提供因特網(wǎng)訪問。家庭計(jì)算機(jī)40包括主存儲(chǔ)設(shè)備42和輔存儲(chǔ)設(shè)備44。LAN 1支持電子郵件發(fā)報(bào)服務(wù),該服務(wù)使每個(gè)計(jì)算機(jī)10在LAN 1內(nèi)把報(bào)文發(fā)送到其它計(jì)算機(jī)10,以及把報(bào)文向LAN 1外發(fā)送到諸如家庭計(jì)算機(jī)等網(wǎng)絡(luò)外的計(jì)算機(jī)。圖1所示的結(jié)構(gòu)是商行中常用的典型LAN的示意。然而,本領(lǐng)域內(nèi)的普通技術(shù)人員應(yīng)理解,本發(fā)明可以各種網(wǎng)絡(luò)結(jié)構(gòu)來實(shí)行。此外,本發(fā)明的電子郵件發(fā)報(bào)系統(tǒng)還可等價(jià)地應(yīng)用于非網(wǎng)絡(luò)設(shè)備,例如,在這些設(shè)備中,由獨(dú)立式計(jì)算機(jī)經(jīng)由調(diào)制解調(diào)器或其它連接來發(fā)送和接收電子郵件報(bào)文。此外,可通過或不通過至外部計(jì)算機(jī)的調(diào)制解調(diào)器或其它連接而在獨(dú)立式計(jì)算機(jī)上實(shí)行本發(fā)明的文檔保存和刪除特征。
現(xiàn)在將參考圖1的結(jié)構(gòu)來說明可依據(jù)本發(fā)明來減輕的文檔保存和銷毀物體的一些問題。
為了說明,假設(shè)把局域網(wǎng)安裝在采用要求銷毀超過兩年的舊文檔的文檔保存政策的商行中。通常,通過在服務(wù)器20上安裝周期性地掃描主網(wǎng)絡(luò)存儲(chǔ)設(shè)備22的程序并刪除創(chuàng)建日期比當(dāng)前掃描日期早兩年多的文檔來實(shí)行這種文檔保存政策。這種程序的一個(gè)問題是,它沒有充分地考慮到未存儲(chǔ)在網(wǎng)絡(luò)存儲(chǔ)設(shè)備中的文檔拷貝。
例如,假設(shè)用戶-1在計(jì)算機(jī)10.1上創(chuàng)建一文檔,并把它存儲(chǔ)在網(wǎng)絡(luò)存儲(chǔ)設(shè)備22上。然后,在一周以后,用戶-1把文檔拷貝到計(jì)算機(jī)10.1的硬驅(qū)12.1上以及經(jīng)由輔存儲(chǔ)設(shè)備14.1拷貝到軟盤上。此外,由于該文檔在主網(wǎng)絡(luò)存儲(chǔ)設(shè)備22上,所以用戶-2可把該文檔拷貝計(jì)算機(jī)10.2的主存儲(chǔ)設(shè)備12.2上以及經(jīng)由輔存儲(chǔ)設(shè)備14.2拷貝到另一個(gè)軟盤上,而不必讓用戶-1知道。這樣,已產(chǎn)生了該文檔的五個(gè)拷貝,網(wǎng)絡(luò)文檔保存程序只能訪問和刪除其中之一。
由圖1的LAN提供電子發(fā)報(bào)業(yè)務(wù)這一事實(shí)使上述問題更為復(fù)雜。結(jié)果,用戶-1可創(chuàng)建一電子郵件報(bào)文并經(jīng)由因特網(wǎng)服務(wù)器30把它向LAN外發(fā)送到計(jì)算機(jī)40。此外,可把先前創(chuàng)建的文檔文件作為附件插入電子郵件報(bào)文中。這樣產(chǎn)生了另外的問題。例如,可把電子郵件報(bào)文及其附件向LAN外發(fā)送到不了解商行的文檔保存政策的第三方。在任何情況下,即使只把電子郵件發(fā)送到雇員的家庭計(jì)算機(jī),該家庭計(jì)算機(jī)也不能被網(wǎng)絡(luò)文檔保存程序所訪問。
通常,對(duì)未存儲(chǔ)在網(wǎng)絡(luò)存儲(chǔ)設(shè)備上的文檔執(zhí)行文檔保存政策需要每個(gè)雇員搜索其各自硬驅(qū)的每個(gè)目錄以及其每個(gè)軟盤或其它輔助存儲(chǔ)媒體。此外,由于電子郵件系統(tǒng)可包括文檔作為電子郵件報(bào)文的附件的能力,所以可把較舊的文檔隱藏在最新的電子郵件報(bào)文中,使得難于識(shí)別和刪除這些文檔。雇員還必須搜索其膝上型和家庭計(jì)算機(jī)中的商業(yè)文件。此外,即使每個(gè)雇員都能勤快地進(jìn)行這些費(fèi)時(shí)的任務(wù),也將存在文檔繼續(xù)留在第三方的計(jì)算機(jī)上的可能性。
與實(shí)行文檔保存政策有關(guān)的另一個(gè)問題是,通常,在從存儲(chǔ)媒體刪除文檔時(shí),并未除去該文檔本身。相反,計(jì)算機(jī)只除去表示該文檔在存儲(chǔ)媒體中的位置的文檔指針。文檔本身仍保留在存儲(chǔ)媒體中,直到計(jì)算機(jī)以另一個(gè)文檔對(duì)其進(jìn)行改寫。結(jié)果,為了使雇員確保文檔確實(shí)被刪除,他們必須以空字符來改寫該文檔然后刪除文檔,從而進(jìn)一步增加了與執(zhí)行文檔保存政策有關(guān)的時(shí)間。
嵌入文檔或電子郵件報(bào)文中的可執(zhí)行模塊依據(jù)本發(fā)明,提供了一種把可執(zhí)行模塊附加到文檔的自毀文檔系統(tǒng)。依據(jù)本發(fā)明的另一個(gè)實(shí)施例,提供了一種在電子報(bào)文或報(bào)文附件產(chǎn)生時(shí)把可執(zhí)行模塊附加到報(bào)文或報(bào)文附件的自毀電子郵件發(fā)報(bào)系統(tǒng)??梢匀魏喂姆绞桨芽蓤?zhí)行模塊附加到報(bào)文或文檔。例如,參考圖2,可把可執(zhí)行模塊作為前置病毒(圖2A)、作為附加病毒(圖2B)或以任何公知的方式來附加。例如,可利用匯編語言、高級(jí)編程語言或宏等任何方式來產(chǎn)生模塊本身。附加的可執(zhí)行模塊使文檔或報(bào)文在碰到預(yù)定條件時(shí)就自毀。這樣,可執(zhí)行模塊設(shè)定了可控制文檔壽命的“壽命控制”。例如,在上述說明中,對(duì)可執(zhí)行模塊進(jìn)行編程,以在當(dāng)前日期比文檔或報(bào)文的創(chuàng)建日期晚兩年多時(shí)刪除文檔或該文檔附加到的報(bào)文。依據(jù)本發(fā)明的再一個(gè)實(shí)施例,可執(zhí)行模塊在刪除文檔或報(bào)文前以空字符(例如,全都是“X”)來改寫文檔或該文檔附加到的報(bào)文。
依據(jù)本發(fā)明的還有一個(gè)實(shí)施例,可在出現(xiàn)其它或附加條件時(shí)判斷改寫和/或刪除文檔或報(bào)文。例如,系統(tǒng)可構(gòu)成在文檔i)被關(guān)閉或ii)被第二次打開時(shí)改寫和/或刪除報(bào)文或文檔,從而產(chǎn)生在被銷毀前只可讀一次的文檔。此外,系統(tǒng)還可構(gòu)成在嘗試拷貝、轉(zhuǎn)送或打印報(bào)文或文檔時(shí)改寫和/或刪除報(bào)文或文檔。此外,系統(tǒng)還可構(gòu)成阻止打印或拷貝報(bào)文或文檔的任何嘗試,從而產(chǎn)生只能看而不能打印的文檔。還可以一事件來觸發(fā)這些附加的壽命控制,從而在輸入密碼或密鑰時(shí)解除阻止打印或拷貝,或者從而在預(yù)定的時(shí)間周期或其它事件后施加阻止打印或拷貝。
依據(jù)本發(fā)明的另一個(gè)實(shí)施例,該系統(tǒng)可使LAN管理者預(yù)定改寫/刪除條件,從而給所有的系統(tǒng)用戶以及由系統(tǒng)用戶所創(chuàng)建的所有文檔或報(bào)文施加文檔保存政策。同樣,可使該系統(tǒng)構(gòu)成使每個(gè)用戶選擇特定文檔或報(bào)文是否包括改寫/刪除條件。此外,可使用戶從各自改寫/刪除條件中進(jìn)行選擇。例如,這可以通過工具菜單來實(shí)現(xiàn)。
現(xiàn)在將描述用于實(shí)行自毀電子文檔或提供自毀電子報(bào)文系統(tǒng)的示例方法。雖然這里所描述的示例實(shí)施例是針對(duì)Microsoft WordTM、Microsoft ExcelTM和Microsoft OutlookTM環(huán)境來加以說明的,但本領(lǐng)域內(nèi)的普通技術(shù)人員應(yīng)理解可在各自環(huán)境下以及以各自方式來實(shí)行本發(fā)明。
圖3和4示出用于Microsoft WordTM6.0文檔的自毀電子發(fā)報(bào)系統(tǒng)的示意圖。參考圖3,在步驟200,用戶開始在例如圖1的辦公計(jì)算機(jī)10.1上創(chuàng)建一文檔或報(bào)文。在步驟220,系統(tǒng)創(chuàng)建“AutoOpen”宏并把該宏保存在“Normal.dot”文件中。依據(jù)Microsoft WordTM的構(gòu)造,每當(dāng)打開Word文檔時(shí),就將執(zhí)行標(biāo)題為AutoOpen的宏。把步驟220處所參考的以WordBasicTM編程語言來寫的指令作為AutoOpen宏保存在normal.dot模板文件中。Normal.dot是由WordTM程序指定為全局宏的存儲(chǔ)文件的模板。在步驟230,把包括AutoOpen宏的normal.dot文件拷貝到名為“message.dot”的文件。然后,在步驟240,從normal.dot文件中刪除AutoOpen宏。在步驟250-260,打開message.dot文件,并提示用戶插入文檔或報(bào)文的文本。然后,在步驟270,保存現(xiàn)在包括文檔或報(bào)文以及normal.dot文件的拷貝的message.dot文件。normal.dot文件的拷貝繼而包括AutoOpen宏。在步驟280-290,把message.dot文件更名為message.doc,然后把它作為電子郵件報(bào)文或電子郵件報(bào)文附件發(fā)送。
在因特網(wǎng)上經(jīng)由LAN服務(wù)器20和因特網(wǎng)服務(wù)器30把電子郵件報(bào)文發(fā)送到家庭計(jì)算機(jī)40。在由報(bào)文的收件人打開message.doc文件時(shí),將執(zhí)行嵌入message.doc文件的AutoOpen宏。圖4是被嵌入message.doc文件的AutoOpen宏的流程圖。在步驟310,DateSerial()函數(shù)返還一表示報(bào)文創(chuàng)建日期的系列值作為變量“created”。在創(chuàng)建AutoOpen宏的同時(shí)(圖3的步驟210和220)就設(shè)定函數(shù)DateSerial的自變量,把該自變量任意地表示為圖3和4中的1997年6月10日。在步驟320,Today()函數(shù)返還表示當(dāng)前日期的系列值作為變量“curdate”。由這些函數(shù)所返還的系列值為1和802074之間的整數(shù),1相應(yīng)于1899年12月31日,802074相應(yīng)于4095年12月31日。在步驟330,把變量“difference”設(shè)定為“curdate”與“created”之差。結(jié)果,變量“difference”等于從產(chǎn)生message.doc文件到打開文檔的當(dāng)前日期之間所經(jīng)過的天數(shù)。
步驟340到360構(gòu)成了一“If,Then”語句,它確定創(chuàng)建日期和當(dāng)前日期之間所經(jīng)過的時(shí)間是否超過預(yù)定閾值。為了說明,已把閾值設(shè)定為60天。在步驟340,把變量“difference”與值60相比較。如果“difference”大于60,即如果從message.doc文件創(chuàng)建后已經(jīng)過60多天,則執(zhí)行步驟350、360和370。在步驟350,執(zhí)行EditReplace.Find函數(shù)。此函數(shù)以空字符(它已被任意地設(shè)定為“X”)來替換message.doc文件的每一個(gè)字符。然后,在步驟360,保存并關(guān)閉已被改寫為與message.doc文件中文本字符數(shù)目相等的一系列“X”字符的message.doc文件。這樣,以空字符改寫了從中檢索到message.doc文件的存儲(chǔ)器位置。相反,如果在步驟340,變量“difference”小于或等于60,則跳到步驟370并報(bào)文的收件人能自由地查看和編輯報(bào)文。
實(shí)際上,可把圖4所示的宏修改成進(jìn)行附加的函數(shù)。例如,可把宏修改成通過利用FileNameFrom Window$()函數(shù)在打開message.doc文件的同時(shí)檢索該文件的位置,然后利用Kill函數(shù)來刪除該文件,這樣在message.doc文件被保存后刪除該文件。此外,還可把宏修改成使打開message.doc文件的用戶推遲報(bào)文的刪除。
圖5(a)到5(c)和以下的表1示出一自毀文檔系統(tǒng),該系統(tǒng)是相對(duì)于MicrosoftExcelTM示出的。參考表1,示出用于創(chuàng)建自毀Excel文檔的示意的Visual BasicTM程序,該程序包括為Microsoft WindowsTM環(huán)境所實(shí)現(xiàn)的用戶界面。所示的示例利用由Microsoft ExcelTM所支持的“auto_open”和“auto_close”例程。依據(jù)所示的實(shí)施例,這些例程位于Microsoft ExcelTM的xlstart子目錄中的“book.xlt”模板中。這樣,把具有auto_open和auto_close程序的book.xlt用作所創(chuàng)建的每個(gè)MicrosoftExcelTM文檔的模板。因此這些例程位于Excel文檔中。
每當(dāng)創(chuàng)建Excel文檔時(shí),就把表1的程序作為宏嵌入文檔中。當(dāng)關(guān)閉文檔時(shí),實(shí)行auto_close程序。在從自定義文檔特性(表1的23-26行)中讀取變量“l(fā)cdata”和“l(fā)cmode”后,程序查看是否已對(duì)該文檔設(shè)定壽命控制(表1的28行)。如果已實(shí)行壽命控制,則退出auto_close例程(表1的29行)。如果還未實(shí)行壽命控制,則程序詢問用戶是否希望實(shí)行壽命控制(圖5a)。如果他們希望,則程序請(qǐng)求用戶輸入該文檔的期滿日期(圖5(b)和表1的35-36行)。然后把期滿日期設(shè)定為“l(fā)cdata”并把“l(fā)cmode”設(shè)定為“1”(表1的37-38行)。如果用戶不希望實(shí)行壽命控制,則把“l(fā)cmode”設(shè)定為“0”并把”lcdata設(shè)定為“”(表1的39-41行)。把“l(fā)cmode”和“l(fā)cdata”的值作為自定義文檔特性保存在ExcelTM文檔內(nèi)。
當(dāng)打開包含嵌入程序的ExcelTM文檔時(shí),執(zhí)行auto_open宏(表1的2-20行)。從自定義文檔特性中讀取“l(fā)cmode”和“l(fā)cdata”的值(表1的4-7行)。如果“l(fā)cmode”等于“1”(第9行)且當(dāng)前日期在“l(fā)cdata”中的日期以后(第10行),則把該文檔的名稱存儲(chǔ)在變量“fn”(第12行)中,把聲明該文檔不再有效的報(bào)文作為報(bào)文框顯示在計(jì)算機(jī)的顯示屏幕上(圖5(c)和表1的14行),并關(guān)閉和刪除該文檔(第15-16行)。雖然表1的程序在Excelwd被刪除前不以空數(shù)據(jù)來改寫該文檔,但例如使用如下所述Visual BasicTM程序中的Clear方法可容易地加上此功能If DateValue(Date)>=DateValue(lcdata)ThenRange(“A1”).SelectRange(Selection,Selection.SpecialCells(XlLastCell)).SelectSelection.ClearActiveWorkbook.Save圖6a到6c和表2(a,b)示出一自毀文檔系統(tǒng),該系統(tǒng)是相對(duì)于Microsoft Word97TM示出的。參考表2(a,b),示出用于產(chǎn)生自毀Word 97文檔的示意的VisualBasicTM程序,該程序包括為Microsoft Windows環(huán)境而實(shí)行的用戶界面。所示的示例利用FileSave和FileSaveAs宏來啟動(dòng)壽命控制,并利用AutoOpen宏來執(zhí)行壽命控制。依據(jù)所示的實(shí)施例,把表2的程序作為模板嵌入文檔中。
每當(dāng)產(chǎn)生Word 97TM時(shí),就把表2的程序嵌入該文檔中。該程序位于作者的工作站上的外部文檔模板中,并使用表2c所示的AutoNew宏拷貝到新的文檔中。這個(gè)宏執(zhí)行函數(shù)“InstallSDD”,該函數(shù)從模板SDD.dot中讀取表2的程序并使用Microsoft Word Organizer對(duì)象把該程序的內(nèi)容拷貝到新的文檔中。依據(jù)本發(fā)明的本實(shí)施例,使用此方法保證了把嵌入的程序封裝到文檔中。
當(dāng)保存新文檔(表2b的FileSave或FileSaveAS)時(shí),讀取變量“l(fā)cmode”。如果未定義“l(fā)cmode”(即,這是第一次保存該文檔),則調(diào)用例程“pflmplementLifetimeControls”(表2a),且該程序詢問用戶是否希望實(shí)行壽命控制(圖6a,表2)。如果他們希望,則該程序請(qǐng)求用戶輸入文檔的期滿日期(圖6(b)和表2a)。然后把期滿日期存儲(chǔ)為“l(fā)cdata”并把“l(fā)cmode”設(shè)定為“1”(表2a)。如果用戶不希望實(shí)行壽命控制,則把“l(fā)cmode”設(shè)定為“0”并把“l(fā)cdata”設(shè)定為“”(表2a)。把“l(fā)cmode”和“l(fā)cdata”的值作為文檔變量存儲(chǔ)在Word 97TM文檔中。
當(dāng)打開包含嵌入程序的Word 97Tmwd時(shí),執(zhí)行AutoOpen(表2b)。使用“pfGetLcmode”和“pfGetLcdata”函數(shù)(表2a,2b)來讀取“l(fā)cmode”和“l(fā)cdata”的值。如果“l(fā)cmode”等于“1”(表2b),且當(dāng)前日期在“l(fā)cdata”中的日期以后,則把該文檔的名稱存儲(chǔ)在變量中(第12行),把變量“rng”設(shè)定為文檔的長(zhǎng)度,以空數(shù)據(jù)來改寫文檔(ret=rng.Delete)然后刪除文檔(Kill(dlg.name)),并把聲明該文檔不再有效的報(bào)文作為報(bào)文框顯示在計(jì)算機(jī)的顯示屏幕上(圖6(c)和表2b)。
圖7(a)到7(e)以及表3示出一自毀文檔系統(tǒng),該系統(tǒng)是相對(duì)于MicrosoftOutlookTM示出的。參考表3,示出用于產(chǎn)生自毀OutlookTM電子郵件報(bào)的示意的Visual Basic程序,該程序包括為Microsoft Windows環(huán)境而實(shí)行的用戶界面。參考圖7(a)和7(b),把名為“Self-destruct”73的制表符加到默認(rèn)的電子郵件報(bào)文模板。圖7(a)示出在用戶希望創(chuàng)建電子郵件報(bào)文時(shí)顯示的常規(guī)“message”制表框74。制表框74包括電子郵件報(bào)文文本76和電子郵件接收者的地址77。圖7(b)示出自毀制表框,它包括表示報(bào)文是否為自毀報(bào)文的觸發(fā)器框71以及其中輸入銷毀日期的日期框72。如下所述,把銷毀日期嵌入電子郵件報(bào)文中并在打開電子郵件報(bào)文時(shí)檢索和處理。
Outlook 98支持Visual Basic代碼的Outlook Items(諸如報(bào)文、日歷入口、任務(wù)等獨(dú)立對(duì)象)。為每個(gè)Item定義事件集合,并可把Visaul basic代碼寫為與每個(gè)事件一致。在Outlook對(duì)象模型中,公知的電子郵件報(bào)文為“MailItem”。OutlookTM使編程人員可截取和修改應(yīng)用行為,并截取和修改報(bào)文創(chuàng)建和報(bào)文打開行為。
表3示出Visual Basic程序,該程序被嵌入電子郵件報(bào)文中并在使用Item_Open函數(shù)打開電子郵件報(bào)文時(shí)執(zhí)行。當(dāng)產(chǎn)生電子郵件報(bào)文時(shí),把一檢查輸入自毀制表符73的觸發(fā)器框71,并把一日期輸入日期框72,然后把觸發(fā)器框71的值存儲(chǔ)在“Item.UserProperties(“DoDestruct”)”中,并把輸入日期框72中的日期存儲(chǔ)“Item.UserProperties(“DestructDate”)”中。把這些值與表3的程序一起嵌入電子郵件報(bào)文中。當(dāng)打開此電子郵件報(bào)文時(shí),自動(dòng)地執(zhí)行嵌入的程序FunctionItem_Open。參考表3,如果DoDestruct特性為False(即,該報(bào)文不是自毀報(bào)文),則退出該程序并打開電子郵件報(bào)文。然而,如果DoDestruct特性為True,則程序通過實(shí)行函數(shù)“itemExpired”來查看該報(bào)文是否期滿,繼而實(shí)行函數(shù)“daysTilDestruct”。此函數(shù)days TilDestruct從“DestructDate”的值中減去當(dāng)前日期并返還日期的差值。把由函數(shù)days TilDestruct返還的值存儲(chǔ)在函數(shù)itemExpired的變量“dt”中。如果“dt”小于或等于零,則函數(shù)“itemExpired”向函數(shù)Item_Open返還布爾型值True,以圖7(e)所示的文本“此報(bào)文不再有效”來改寫報(bào)文的文本,并在圖7(d)所示的對(duì)活框中顯示報(bào)文“此報(bào)文不再有效”,如果“dt”大于1,則“itemExpired”返還布爾型值False,并在圖7(c)所示的對(duì)話框中顯示報(bào)文”此報(bào)文將在[days TilDestruct]天內(nèi)銷毀”。
表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″,F(xiàn)alse,msoProPertyTypeString,″l″) ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcdata″,F(xiàn)alse,msoPropertyTypeString,lcdata) ElseIf ret=vbNo Then ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcmode″,F(xiàn)aise,msoPropertyTypeString,″0″) ret=ActiveWorkbook.CustomDocumentProperties.Add(″lcdata″,F(xiàn)alse,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此外,依據(jù)上述自毀文檔的可執(zhí)行模塊還可利用加密技術(shù)來防止用戶例如通過以不能執(zhí)行可執(zhí)行模塊的應(yīng)用程序打開自毀文檔來使壽命控制失效。依據(jù)這樣的實(shí)施例,當(dāng)?shù)谝淮伪4婊蜿P(guān)閉一個(gè)文檔時(shí),可執(zhí)行模塊將對(duì)該文檔加密。然后,當(dāng)后來打開該文檔時(shí),可執(zhí)行模塊將只在壽命控制有效時(shí)才對(duì)該文檔解密。此外,如果以不能執(zhí)行可執(zhí)行模塊的應(yīng)用程序來打開文檔,則文檔將保持加密,且用戶不能查看該文檔。作為一個(gè)例子,如果用戶產(chǎn)生用WordPerfectTM應(yīng)用程序來打開自毀Microsoft WordTM文檔,則WordPerfectTM應(yīng)用程序?qū)⒉荒軋?zhí)行Microsoft WordTMAutoOpen或FileOpen宏,且無論該文檔的壽命控制是否有效,該文檔都將被打開。然而,如果預(yù)先通過AutoClose、FileSave或FileSaveAs宏(例如,使用如下所述的異或多字母碼)對(duì)自毀Microsoft WordTM文檔進(jìn)行加密,則文檔將保持加密,除非用戶使用執(zhí)行這些宏的應(yīng)用程序(包括異或多字母密碼的相應(yīng)解密算法)來打開文件。選擇適當(dāng)?shù)募用芗夹g(shù)將依據(jù)所需的安全程度以及用于實(shí)行該技術(shù)的宏或描述文本(script)。
虛擬容器現(xiàn)在將描述利用虛擬容器的依據(jù)本發(fā)明的文檔安全系統(tǒng)。
依據(jù)圖8a所示文檔安全系統(tǒng)的第一實(shí)施例,文檔組容器500用于存儲(chǔ)一個(gè)或多個(gè)文檔510(或其它數(shù)字對(duì)象),每個(gè)文檔具有獨(dú)立的壽命控制520。在用戶希望打開和顯示容器內(nèi)容的任何計(jì)算機(jī)上安裝一工具。該工具使文檔的壽命控制在把文檔顯示給用戶前有效。如果壽命控制有效,則從容器中提取的文檔可被用戶所使用。如果壽命控制無效,則例如通過以空數(shù)據(jù)改寫文檔來銷毀文檔。
依據(jù)圖8(b)所示文檔安全系統(tǒng)的第二實(shí)施例,容器代理500′可用于存儲(chǔ)單個(gè)文檔510′(或其它數(shù)字對(duì)象)。把代理處理程序安裝在用戶希望打開并顯示代理容器中的文檔的任何計(jì)算機(jī)上。與文檔組容器不同的是,代理的操作對(duì)于用戶是不可見的---除非文檔的壽命控制520′無效。為了提供此透明度,對(duì)代理進(jìn)行命名或編碼而顯示為文檔的普通實(shí)例,可改變把文檔與其應(yīng)用程序相關(guān)聯(lián)的操作系統(tǒng)機(jī)構(gòu)以使文檔改為與代理處理程序相關(guān)聯(lián)。如果壽命控制有效,則代理處理程序?qū)⑦^渡性地完成文檔與應(yīng)用程序之間的關(guān)聯(lián)。本實(shí)施例利用了這樣的優(yōu)勢(shì),即在例如通過鼠標(biāo)器單擊“My Computer”中Windows 95文檔圖標(biāo)、Windows 95TM桌面中的文件或Windows 3.1的文件管理器中的文件來訪問文件時(shí),操作系統(tǒng)將嘗試把該文件與諸如MicroSoftTMWord、Microsoft ExcelTM或WordPerfectTM等應(yīng)用程序關(guān)聯(lián)。依據(jù)容器代理,把容器代理工具插在操作系統(tǒng)和應(yīng)用程序之間,從而在用戶訪問容器代理(它將作為普通文檔呈現(xiàn)給用戶)時(shí),操作系統(tǒng)將調(diào)用容器開啟工具來自動(dòng)地打開該容器,如果壽命控制有效,則將啟動(dòng)該應(yīng)用程序并打開該容器中的文檔。如果壽命控制無效,則例如通過以空數(shù)據(jù)改寫文檔和/或刪除文檔來銷毀該文檔。依據(jù)容器代理的另一個(gè)實(shí)施例,系統(tǒng)可構(gòu)成在應(yīng)用程序被關(guān)閉時(shí)把文檔自動(dòng)地返還容器代理。
現(xiàn)在將討論文檔組容器(DS容器)的各種實(shí)施例。依據(jù)DS容器的第一實(shí)施例,提供了容器開啟工具和容器創(chuàng)建工具。容器創(chuàng)建工具位于用戶希望創(chuàng)建DS容器的計(jì)算機(jī)上,此工具的名稱暗示著它可用于創(chuàng)建DS容器、指定壽命控制并把文檔置于DS容器中。容器開啟工具位于用戶希望打開DS容器的計(jì)算機(jī)上,此工具可用于打開DS容器、檢查壽命控制的有效性以及在壽命控制有效時(shí)從DS容器中提取文檔。如果壽命控制無效,則例如通過以空數(shù)據(jù)改寫文檔來銷毀該文檔。依據(jù)一個(gè)實(shí)施例,DS容器只包含一個(gè)文檔。依據(jù)另一個(gè)實(shí)施例,可在單個(gè)容器中存儲(chǔ)多個(gè)文檔,每個(gè)文檔可具有它自己的壽命控制。在想要使用戶可打開DS容器而不是創(chuàng)建DS容器時(shí),可把容器開啟工具而不是容器創(chuàng)建工具安裝到計(jì)算機(jī)上。未打開的DS容器作為單個(gè)文件呈現(xiàn)給用戶,它包括標(biāo)題信息(例如,包括壽命控制)以及該文檔或這些文檔本身,而與DS容器中所存在的文檔數(shù)目無關(guān)。
依據(jù)本發(fā)明的多文檔DS容器的另一個(gè)方面,DS容器可包括容器標(biāo)題,此標(biāo)題包含該容器的控制信息并引用兩個(gè)流的單鏈接列表。第一鏈接列表包含活動(dòng)(active)流,第二鏈接列表包含非活動(dòng)流。活動(dòng)流相應(yīng)于仍具有有效壽命控制的文檔,非活動(dòng)流相應(yīng)于具有無效壽命控制或已從容器中除去(刪除)的文檔?;顒?dòng)和非活動(dòng)流都具有標(biāo)題,這些標(biāo)題包含用于其相應(yīng)流的壽命控制(以及最好是如下所述的加密信息)。這些流的標(biāo)題中的每一個(gè)都包含對(duì)其列表(無論是活動(dòng)的還是非活動(dòng)的)中下一個(gè)流的引用指針(reference)或表示該流是其列表中最后一個(gè)流的指示符。每個(gè)流是二進(jìn)制數(shù)據(jù)的連續(xù)塊。
在使一個(gè)流無效或從容器中除去時(shí),把其流標(biāo)題標(biāo)記為非活動(dòng)并移動(dòng)到非活動(dòng)流列表中,并以空數(shù)據(jù)來改寫該流。在把新的流加到容器中時(shí),可在非活動(dòng)流的長(zhǎng)度足以包含此新的流時(shí)重新激活并使用此非活動(dòng)流。如果沒有非活動(dòng)流或它不足以包含新的流,則可在容器中創(chuàng)建和激活新的流。如果容器的活動(dòng)和非活動(dòng)流列表經(jīng)過許多變化,則該容器將變得碎片化。換句話說,在文檔期滿并被空數(shù)據(jù)替換時(shí),活動(dòng)文檔可能被夾在只包括空數(shù)據(jù)的一個(gè)或多個(gè)非活動(dòng)文檔之間。在本發(fā)明的一個(gè)較佳實(shí)施例中,容器創(chuàng)建工具可檢測(cè)此情況并對(duì)容器作必要的壓縮。
圖9(a)和(b)示出本發(fā)明的活動(dòng)/非活動(dòng)流的實(shí)施例。圖9(a)示出已創(chuàng)建了三個(gè)文檔包含在其中的虛擬容器。如圖9(a)所示,容器標(biāo)題包括容器信息(諸如容器的名稱、容器的默認(rèn)壽命控制、容器創(chuàng)建的日期、最后修改容器的日期DM 804以及最后訪問容器的日期)、與活動(dòng)流有關(guān)的信息(諸如對(duì)活動(dòng)流中第一個(gè)文檔的指針和活動(dòng)流中文檔的數(shù)目)以及與非活動(dòng)流有關(guān)的信息(諸如對(duì)非活動(dòng)流中第一文檔的指針以及非活動(dòng)流中文檔的數(shù)目)。容器中的每個(gè)文檔包括文檔標(biāo)題,該標(biāo)題包括壽命控制信息以及其各自流中下一個(gè)文檔的指針。自從創(chuàng)建容器時(shí),這三個(gè)文檔就處于活動(dòng)流中,容器標(biāo)題包括活動(dòng)流次標(biāo)題,該次標(biāo)題包括對(duì)第一個(gè)文檔的指針以及表示這三個(gè)文檔都處于活動(dòng)流中的指示。非活動(dòng)流次標(biāo)題包括空信息。然后,在圖9(b)中,已把兩個(gè)新的文檔(文檔4和5)加到容器中,且文檔2已期滿。雖然活動(dòng)流容器次標(biāo)題仍舊指向文檔1,但現(xiàn)在文檔1標(biāo)題中的指針指向文檔3而不是文檔2。此外,現(xiàn)在非活動(dòng)流容器次標(biāo)題指向文檔2。
如上所述,依據(jù)本發(fā)明的虛擬容器包含一個(gè)或多個(gè)文檔,應(yīng)在這些文檔不再有效時(shí)銷毀它們(由其壽命控制來確定)。一般,使這些控制失效所需努力的成本應(yīng)超過延長(zhǎng)文檔的有效壽命的價(jià)值。
依據(jù)本發(fā)明的一個(gè)較佳實(shí)施例,為了防止對(duì)虛擬容器中的文檔進(jìn)行未授權(quán)的訪問并防止用戶使文檔的壽命控制失效,對(duì)該容器中的文檔進(jìn)行加密。例如,這些加密技術(shù)可被這里所述的任何虛擬容器所使用,包括圖8a、9a和9b中的DS容器以及圖8a的代理容器。
依據(jù)本發(fā)明的另一個(gè)實(shí)施例,該系統(tǒng)使作者根據(jù)包含在其中的文檔的已知值從幾個(gè)安全等級(jí)中進(jìn)行選擇。一般,隨著安全等級(jí)增加時(shí),使它失效所需的努力也增加---從而安全本身的成本和復(fù)雜性也增加。在描述如何在虛擬容器中使用加密前,將討論加密技術(shù)的某些基本原理。
加密技術(shù)概況一般,加密技術(shù)(通常被叫做加密系統(tǒng))由兩個(gè)基本成分所構(gòu)成算法和密鑰。算法是轉(zhuǎn)換數(shù)據(jù)的數(shù)學(xué)函數(shù)。密鑰“指示”轉(zhuǎn)換的確切特性。
加密算法可以公開或保密的。公開算法由其設(shè)計(jì)者所公開,由學(xué)術(shù)界考察并通過商業(yè)啟用來審核。保密算法是設(shè)計(jì)者不希望公眾了解或使用的專利成果。一般,在商業(yè)產(chǎn)品中使用的加密算法是“公開”算法。一般,可把已公開、考察并在經(jīng)過長(zhǎng)時(shí)期的廣泛實(shí)行后仍舊在使用的加密算法作為安全的算法,因?yàn)樗咽艿酱蠖鄶?shù)研究所的分析以及全世界的計(jì)算機(jī)科學(xué)的學(xué)生的攻擊而未受到危害。
一般從有效加密系統(tǒng)的密鑰中得到其強(qiáng)度。假設(shè)加密算法已被宣布(如上所述),則加密系統(tǒng)的安全性有賴于產(chǎn)生適當(dāng)?shù)拿荑€以及小心地保護(hù)其保密性。合適性的一個(gè)重要措施是密鑰的長(zhǎng)度---通常以位來表示。短的密鑰有利于快速的加密和解密,但加密的報(bào)文更容易被破譯。長(zhǎng)的密鑰需要長(zhǎng)的加密和解密處理,但有可能根本就不能破譯。這種領(lǐng)悟力非常普遍,從而美國政府允許自由而公開地使用任何加密算法,但對(duì)密鑰的長(zhǎng)度有嚴(yán)格的限制。
雖然依據(jù)本發(fā)明可使用各自公開和保密的加密技術(shù),但這里將對(duì)四個(gè)加密技術(shù)進(jìn)行簡(jiǎn)要地討論對(duì)稱算法、公共密鑰算法、數(shù)字簽名(signature)和單向散列(hash)。
對(duì)稱算法一般依賴于單個(gè)密鑰來對(duì)報(bào)文進(jìn)行加密和解密。這些算法容易理解和使用,并在適當(dāng)使用時(shí)提供了相對(duì)高的安全等級(jí)。然而,雙方必須在通信前商定密鑰,而不要把給密鑰意外地泄露給第三方。此外,必須使密鑰永遠(yuǎn)保密,或者可在以后對(duì)較老的報(bào)文進(jìn)行解密。對(duì)稱算法尤其適用于臨時(shí)報(bào)文---在通信結(jié)束后不保存的報(bào)文。如果不保存該報(bào)文,而密鑰又被破壞,則以后沒有機(jī)會(huì)對(duì)該報(bào)文進(jìn)行解密。流行的對(duì)稱算法是數(shù)據(jù)加密標(biāo)準(zhǔn)(Data Encryption Standard),它是一ANSI和ISO標(biāo)準(zhǔn)并已使用了二十多年。
公共密鑰算法使用一對(duì)密鑰---一個(gè)叫做公共密鑰,另一個(gè)叫做私人(private)密鑰。可使用公共或私人密鑰對(duì)報(bào)文進(jìn)行加密,并使用另一個(gè)密鑰對(duì)該報(bào)文進(jìn)行解密。只有私人密鑰可對(duì)以公共密鑰加密的報(bào)文進(jìn)行解密,只有公共密鑰可對(duì)以私人密鑰加密的報(bào)文進(jìn)行解密。此外,給定了公共密鑰,實(shí)際上就不可能設(shè)計(jì)出其它的私人密鑰。通常,在某些公知的可靠場(chǎng)所(可能是因特網(wǎng)上的數(shù)據(jù)庫或目錄)中公開任何對(duì)的公共密鑰,而所有者保留私人密鑰。適用于公共密鑰加密的常見情景如下Alice想給Bob發(fā)一個(gè)機(jī)密的報(bào)文。Alice可從可靠的源處獲取Bob的公共密鑰。她使用該密鑰對(duì)她給Bob的報(bào)文進(jìn)行加密。當(dāng)Bob接收到此加密報(bào)文時(shí),他可使用自己的私人密鑰對(duì)此報(bào)文進(jìn)行解密。如果a)Alice已獲取Bob的真實(shí)公共密鑰(而不是偽造的),且b)Bob是其私人密鑰的唯一所有者(沒有人有該密鑰的拷貝),則Alice可確認(rèn)只有Bob可讀取她的報(bào)文。流行的公共密鑰算法是由RSA Data Security,Inc.所擁有的RSA加密系統(tǒng)。
把數(shù)字簽名設(shè)計(jì)成證明報(bào)文作者的身份。雖然有許多實(shí)行數(shù)字簽名的方法,但公共密鑰加密非常普遍。我們可把以上所討論的情景延伸到如下所示。Alice想要給Bob發(fā)一個(gè)私人報(bào)文,她想讓Bob確信此報(bào)文是她發(fā)的。畢竟,先前的情景沒有證實(shí)Bob接收到來自Alice的報(bào)文;它只使Alice確信她給Bob的機(jī)密報(bào)文不可能被其它人閱讀。因此,Alice首先用她的私人密鑰對(duì)給Bob的報(bào)文進(jìn)行加密。然后,她再如上所述使用他的公共密鑰對(duì)該(已加密)報(bào)文進(jìn)行加密。當(dāng)Bob接收到該報(bào)文時(shí),他首先使用自己的私人密鑰對(duì)其進(jìn)行解密。然后,為確信此報(bào)文是否的確來自Alice,他從可靠的源處獲取Alice的公共密鑰。他使用該密鑰對(duì)Alice的報(bào)文進(jìn)行解密。如果a)Bob確信Alice的密鑰還未通過拷貝或偽造而破壞(如上對(duì)Bob所述),且b)Alice確信Bob的密鑰還未被破壞,則Alice仍可確認(rèn)只有Bob可以閱讀她的報(bào)文,Bob也可確認(rèn)此報(bào)文來自Alice。RSA Data Security,Inc.生產(chǎn)了被廣泛使用的數(shù)字簽名算法。
雖然數(shù)字簽名是在數(shù)字領(lǐng)域中證明身份的可靠的方法,但還存在要證明文檔的原作者而不需要傳遞整個(gè)(可能很大)文檔的情況。單向散列提供了已知很好的解決方法。它們是把任何數(shù)組(文檔或其它)轉(zhuǎn)換成小的二進(jìn)制信息流的數(shù)學(xué)函數(shù)。單向散列函數(shù)的一個(gè)重要特征是,該函數(shù)不會(huì)從兩個(gè)不同的源中產(chǎn)生兩個(gè)相同的散列。為產(chǎn)生具有此特征的單向散列,在學(xué)術(shù)和商業(yè)研究上已耗費(fèi)了許多精力。MD5是產(chǎn)生128位散列的公知的單向散列函數(shù)。
加密技術(shù)運(yùn)用于虛擬容器根據(jù)本發(fā)明的較佳實(shí)施例,虛擬容器文檔安全系統(tǒng)允許用戶(和/或系統(tǒng)管理員)選擇不同的安全等級(jí)。第一級(jí)安全等級(jí)可以不對(duì)文檔進(jìn)行任何加密。文檔的安全性是根據(jù)容器收件人采用容器開啟工具顯示文檔的要求導(dǎo)出的。然而,可以采用市場(chǎng)上出售的幾種二進(jìn)制文件編輯器中的任何一種編輯器將容器自身作為單個(gè)文檔打開,由此觀看文檔內(nèi)容。同樣,由于絕大多數(shù)字處理程序允許用戶從文檔恢復(fù)ASCII正文,因此能夠采用這種程序?qū)⑷萜髯陨碜鳛閱蝹€(gè)文檔打開,由此觀看文檔內(nèi)容。
第二級(jí)安全等級(jí)可以是一種稱為異或多字母密碼的對(duì)稱加密形式。這種加密算法以軟件執(zhí)行是簡(jiǎn)單的,它能非??斓夭僮?。這種加密算法采用單個(gè)密鑰對(duì)文檔既加密又解密。這個(gè)密鑰可以“硬編碼”到軟件中,它能夠隨軟件而分發(fā)并由用戶周期地改變,或者在每次需要它時(shí)從可靠源處獲取。按照這一方法,文檔是采用密鑰與文檔的異或(即[Document]XOR[key]=[Encrypted Document])對(duì)文檔加密。例如,容器開啟工具和容器創(chuàng)建實(shí)用工具可以包括既加密又解密的單個(gè)“硬加密”對(duì)稱密鑰。文檔的作者利用容器創(chuàng)建工具對(duì)文檔和任選的文檔壽命控制進(jìn)行加密。當(dāng)作者希望分發(fā)文檔時(shí),他把該加密文檔轉(zhuǎn)送到虛擬容器中。收件人利用容器開啟實(shí)用工具對(duì)文檔及其壽命控制進(jìn)行解密。容器開啟實(shí)用工具檢查壽命控制,如果是有效的,向收件人顯示文檔。如果壽命控制不是有效的,容器開啟實(shí)用工具銷毀文檔。
更高一級(jí)的安全等級(jí)可以利用中央授權(quán)(central authority CA)進(jìn)一步保證文檔的安全性。按照CA系統(tǒng)的第一實(shí)施例,作者將文檔及其壽命控制送至CA。CA返回文檔的唯一標(biāo)識(shí)符。當(dāng)作者希望分發(fā)文檔時(shí),他將該唯一標(biāo)識(shí)符傳送給收件人。收件人將該唯一標(biāo)識(shí)符傳送給CA對(duì)文檔進(jìn)行評(píng)審。CA檢查壽命控制,如果是有效的,那么將文檔返回到請(qǐng)求人。請(qǐng)求人接收并顯示文檔。雖然CA的使用增強(qiáng)了安全性,但是,它具有需要中央授權(quán)干預(yù)的缺點(diǎn)。
CA系統(tǒng)的另一個(gè)實(shí)施例采用單向散列。按照這個(gè)實(shí)施例,作者將文檔及其壽命控制傳送至CA。CA對(duì)壽命控制進(jìn)行散列(混編)并將原始?jí)勖刂?、散列壽命控制和文檔組合到一個(gè)容器中。CA用其私人密鑰對(duì)該容器進(jìn)行加密并將數(shù)據(jù)包返回給作者。當(dāng)作者希望分發(fā)文檔時(shí),他將有CA簽字的容器傳送給收件人。收件人采用CA的公共密鑰打開該容器并對(duì)壽命控制進(jìn)行檢查。如果它們是無效的,那么容器被銷毀。如果它們是有效的,那么對(duì)它們進(jìn)行散列并將該散列與存儲(chǔ)在容器中的散列進(jìn)行比較。如果散列不匹配,那么容器被銷毀。如果散列匹配且壽命控制是有效的,那么文檔被顯示。
CA系統(tǒng)的再一個(gè)實(shí)施例采用單向散列和對(duì)稱密鑰。按照這一實(shí)施例,作者將文檔及其壽命控制傳送給CA。CA產(chǎn)生唯一對(duì)稱密鑰(以下稱為DK)并對(duì)文檔進(jìn)行加密。它將文檔的DK和唯一標(biāo)識(shí)符(以下稱為DKID)記錄在其數(shù)據(jù)庫中。CA對(duì)原始?jí)勖刂七M(jìn)行散列,并創(chuàng)建包含原始?jí)勖刂?、散列壽命控制、加密文檔和DKID的容器。它用其私人密鑰對(duì)數(shù)據(jù)包簽字并將該數(shù)據(jù)包返回給作者。當(dāng)作者希望分發(fā)文檔時(shí),他送出有CA簽記的數(shù)據(jù)包。收件人采用CA的公共密鑰打開該數(shù)據(jù)包。它將原始?jí)勖刂?、散列壽命控制和DKID傳送給CA。CA對(duì)壽命控制進(jìn)行檢查。如果是無效的,那么CA停止。如果它們是有效的,那么對(duì)它們進(jìn)行散列并將該散列與從收件人那里接收的散列進(jìn)行比較。如果散列不匹配,那么CA停止。如果散列匹配且壽命控制是有效的,那么CA將對(duì)應(yīng)于DKID的DK返回給收件人。收件人用DK對(duì)文檔進(jìn)行解密并顯示該文檔。
本實(shí)施例的一個(gè)問題是收件人能夠通過創(chuàng)建新的壽命控制、對(duì)它們進(jìn)行散列以及采用容器的原始DKID將散列的新的壽命控制傳送給CA而擊敗系統(tǒng)。按照本實(shí)施例的另一方面能夠緩解這一問題,其中CA創(chuàng)建原始?jí)勖刂啤⑸⒘袎勖刂坪虳KID的加密分容器。只要CA知道加密密鑰(如對(duì)稱密鑰或公共密鑰或私人密鑰)。收件人(他不能用這些密鑰接入分容器)將該分容器傳送給CA。然后,當(dāng)CA對(duì)分容器進(jìn)行解密時(shí),它能夠確信從分容器恢復(fù)的壽命控制、散列壽命控制和DKID是由CA創(chuàng)建和加密的。
以JavaTM編程語音實(shí)施虛擬容器現(xiàn)在將描述含有一個(gè)文檔并采用異或多字母密碼的DS容器的一個(gè)示范實(shí)施例,其中,容器創(chuàng)建和容器開啟實(shí)用工具是以JavaTM編程語音編程的。容器創(chuàng)建和容器開啟工具是利用數(shù)據(jù)和文件流類實(shí)施的,數(shù)據(jù)和文件流類形成Java編程語音的標(biāo)準(zhǔn)I/O封裝的一部分。特定流類的每個(gè)對(duì)象對(duì)應(yīng)于存儲(chǔ)器的一組相鄰字節(jié)。
根據(jù)本實(shí)施例的DS容器包括容器標(biāo)題(它包括容器的控制信息)和容器中文檔的文檔標(biāo)題。雖然DS容器的這個(gè)實(shí)施例設(shè)置成僅容納一個(gè)文檔,而以下描述的另外實(shí)施例能夠容納無數(shù)個(gè)文檔。參考圖10a,按照該單個(gè)文檔DS容器實(shí)施例的較佳實(shí)施,容器標(biāo)題包括容器名稱CNAME 701、創(chuàng)建容器的日期DC 703、最后改動(dòng)容器的日期DM 705、最后訪問容器的日期DLA 704以及容器706中的文檔數(shù)目(或是0或是1)。容器還包括一個(gè)文檔710。該文檔的標(biāo)題包括文檔名稱(707)、文檔的壽命控制(708)和文檔的長(zhǎng)度(709)。按照這一實(shí)施例,DC 703、DM 704和DLA 705字段允許用戶確定創(chuàng)建容器的日期、最后改動(dòng)容器的日期和最后訪問容器的日期,正如以下參照表5(a)的視圖方法所說明的。如果不需要這樣的功能,自然可以省略容器創(chuàng)建、最后改動(dòng)和最后訪問字段。
以下參考表4(a),通過調(diào)用方法“public static int create(Stringenvelopefilename)”創(chuàng)建DS容器,該方法包括字符串“envelopefilename”作為其變?cè)?。如果“envelopefilename”是一個(gè)現(xiàn)有文件名,或者如果它取空值,那么返回出錯(cuò),否則程序繼續(xù)創(chuàng)建新的容器。對(duì)象“fos”被限定在擁有目的文件名“envelopefilename”的FileOutputStream中。相應(yīng)的對(duì)象“dos”在用于容納對(duì)應(yīng)于對(duì)象“dos”的目的數(shù)據(jù)(它是“envelopefilename”)的DataOutputStream中被定義。然后,程序創(chuàng)建標(biāo)題,它將被存儲(chǔ)在DataOutputStream對(duì)象“dos”中。在這方面,對(duì)象“eh”被限定在類SdeEnvelopeHeader中,類SdeEnvelopeHeader的“d_name”字段設(shè)定為字符串“envelopefilename”,“d_created”、“d_last_modified”和“d_last_accessed”字段設(shè)定為當(dāng)前日期。然后,調(diào)用方法“writeTo”(表4(c)),它將容器名稱、容器創(chuàng)建日期、最后改動(dòng)容器的日期、最后訪問容器的日期以及容器中文檔的數(shù)目(當(dāng)前為0)寫入到對(duì)象dos中,由此創(chuàng)建新創(chuàng)建容器的容器標(biāo)題。采用這種方式,容器將作為一個(gè)載有“envelopename”中所含名稱的單個(gè)文件而出現(xiàn)。
參考表4(b),為了將文檔增加到容器中,調(diào)用addDocument方法。方法addDocument取“envelopefilename”、“documentfilename”和“expires”為參數(shù)。如果任何參數(shù)為零,那么返回出錯(cuò)。如果不存在名稱為“envelopefilename”的容器,那么調(diào)用“create”方法(表4(a))來創(chuàng)建容器。如果不存在名稱為“documentfilename”的文檔,那么返回出錯(cuò)。否則,F(xiàn)ileInputStream的對(duì)象“fis”定義為“envelopefilename”,DateInputStream的對(duì)象“dis”定義為對(duì)應(yīng)于“envelopefilename”的數(shù)據(jù)(DateInputStream(fis))。以這種方式,以“fis”和“dis”打開名稱為“envelopefilename”的容器。然后,創(chuàng)建名稱為“[envelopefilename].tmp.”的臨時(shí)容器。在這方面,F(xiàn)ileOutputStream的對(duì)象“fos”被定義為“[envelopefilename].tmp.”,DataOutputStream的對(duì)象“dos”被定義為對(duì)應(yīng)于“[envelopefilename].tmp.”的數(shù)據(jù)(DateInputStream(fos))。
為了更新封殼標(biāo)題,那么創(chuàng)建SdeEnvelopeHeader的對(duì)象“eh”,用方法“readFrom”(表4(c))將“dis”(它是“envelopefilename”的容器標(biāo)題)的內(nèi)容讀入到“eh”中。再參考表4(b),對(duì)類SdeEnvelopeHeader的對(duì)象“d_last_modified”和“d_total_documents”進(jìn)行更新,將更新的封殼標(biāo)題(eh)寫入到DataOutputStream的對(duì)象“dos”中。
為了更新文檔標(biāo)題,將文件的對(duì)象“file_doc”設(shè)定為“documentfilename”的路徑,將變量“l(fā)ength”設(shè)定為與位于“file_doc”處的文件的長(zhǎng)度相等。FileInputStream的對(duì)象“fis_doc”設(shè)定為容納文件“documentfilename”。然后,創(chuàng)建SdeDocumentHeader的對(duì)象“dh”,并將類SdeDocumentHeader的“d_name”字段設(shè)定為字符串“documentfilename”,將“d_expired”字段設(shè)定為參數(shù)“expires”的值,將“d_total_bytes”字段設(shè)定為變量“l(fā)ength”的值。然后,調(diào)用方法“writeTo”(表4(d)),它把文檔名、期滿日和文檔長(zhǎng)度寫入對(duì)象dos,由此創(chuàng)建文檔的文檔標(biāo)題。
然后,將文檔讀入到變量“ch”(int ch=fis_doc.read())并通過在“ch”上執(zhí)行異或功能對(duì)文檔加密。然后,將加密文檔寫入到對(duì)象“dos”中。以這種方式,利用DataOutputStream功能已經(jīng)將經(jīng)過更新的封殼標(biāo)題、文檔標(biāo)題和加密文檔寫入到存儲(chǔ)器的相鄰位置中,并已創(chuàng)建了含有一個(gè)加密文檔的DS容器。然后,刪除原始容器(envelopefilename),將已更新的容器(“[envelopefilename].tmp”)改名為“envelopefilename”。以這種方式,容器將作為載有包含在容器CNAME 71字段中的名稱的單個(gè)文件出現(xiàn),將包括容器標(biāo)題、文檔標(biāo)題和文檔。
現(xiàn)在參考表5(a)和5(b)描述DS容器的開啟工具的實(shí)施。表5(a)示出觀看按照表4(a)至4(c)創(chuàng)建的DS容器的容器標(biāo)題的程序。方法“view”包括兩個(gè)參數(shù),即字符串“envelopename”和PrintStream“ps”。如果“envelopename”或“documentfilename”都不是“空”并且如果存在名稱為“envelopename”的容器,那么,F(xiàn)ileInputStream的對(duì)象“fis”定義為“envelopefilename”,DataInputStream的對(duì)象“dis”定義為對(duì)應(yīng)于“envelopefilename”(DataInputStream(fis))的數(shù)據(jù)。以這種方式,以“fis”和“dis”打開名稱為“envelopename”的容器。然后,創(chuàng)建SdeEnvelopeHeader的對(duì)象“eh”并采用方法“readFrom”(表4(c))將“dis”(它是“envelopefilename”的容器標(biāo)題)的內(nèi)容讀入到“eh”中。最后,利用方法“println”打印容器標(biāo)題信息。
表5(b)示出用于打開按照表4(a)至4(d)創(chuàng)建的DS容器的程序。方法“extractDocument”包括兩個(gè)參數(shù),即字符串“envelopefilename”和“documentfilename”。如果“envelopename”或“documentfilename”都不是“空”并且如果存在名稱為“envelopename”的容器,那么,F(xiàn)ileInputStream的對(duì)象“fis”定義為“envelopefilename”,DataInputStream的對(duì)象“dis”定義為對(duì)應(yīng)于“envelopefilename”(DataInputStream(fis))的數(shù)據(jù)。以這種方式,以“fis”和“dis”打開名稱為“envelopename”的容器。然后,創(chuàng)建SdeEnvelopeHeader的對(duì)象“eh”并采用方法“readFrom”(表4(c))將“dis”(它是“envelopefilename”的容器標(biāo)題)的內(nèi)容讀入到“eh”中。然后,創(chuàng)建SdeDocumentHeader的對(duì)象“eh”并采用方法“readFrom”(表4(c))將類SdeDocumentHeader中“dis”(它是文件標(biāo)題)的內(nèi)容讀入到“dh”中。然后將字段“d_name”與“documentname”進(jìn)行比較,如果它們是相同的,那么程序繼續(xù)檢查文檔“documentname”的期滿日。利用日期方法“before”,如果字段“d_expires”中的日期在當(dāng)前日期之前,那么,將變量“valid”設(shè)定為假。如果不是,將文檔的路徑放入類文件的對(duì)象“file_doc”中。
假設(shè)存在文檔“documentname”并且該文檔未到期,將對(duì)象“file_doc”設(shè)定為新路徑“[documentfilename].x”,將FileOutputStream的對(duì)象“fos_doc”設(shè)定為FileOutputStream(file_doc)。以這種方式,臨時(shí)文件“fos_doc”是由類FileOutputStream創(chuàng)建的。然后,一次一字節(jié)地將文檔讀入到變量“ch”中。通過對(duì)“ch”執(zhí)行異或功能又對(duì)每個(gè)字節(jié)進(jìn)行解密并寫入“fos_doc”中。如果文檔不存在,將“fos_doc”設(shè)定為空值,程序指示文件不存在,如果文檔存在,但是期滿,將“valid”變量設(shè)定為假。這可以防止“fos_doc”與該文檔相關(guān),防止文檔的解密,并使程序指示文檔期滿。為了改寫文檔以便銷毀它,可以將下列指令插入表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)示出能夠被用于既實(shí)施以上針對(duì)表4和5所述的單個(gè)文檔DS容器和又實(shí)施以下針對(duì)圖12和13所述的多個(gè)文檔DS容器的單個(gè)圖形用戶接口。為了創(chuàng)建DS容器,用戶單擊“New”按鈕1510。然后將出現(xiàn)對(duì)話框(未示出),它將提示用戶輸入容器名。一旦已經(jīng)輸入容器名,將創(chuàng)建DS容器,容器名將顯示在題標(biāo)1500上。在圖11(a)和11(b)中,容器名為“demo.env”,容器作為文件“demo.env”存儲(chǔ)在“C\”目錄中。為了將文檔增加到DS容器中,用戶單擊“Add”按鈕1520。然后將出現(xiàn)文件菜單(未示出),它將允許用戶或是瀏覽所需文檔的使用目錄或是直接輸入路徑和文檔名,一旦已經(jīng)選擇文檔,并且期滿日已經(jīng)輸入框1540中,那么文檔將被增加到容器中。一旦文檔已經(jīng)成功地增加到容器中,文檔名、文檔長(zhǎng)度和文檔的期滿日將顯示在框1550中。參考圖11(b),如果容器“demo.env”是在文檔“demo.txt”的期滿日之后打開的,那么,文檔將自動(dòng)地被空數(shù)據(jù)改寫,在框1550中將出現(xiàn)一條消息,表示文檔到期。為了從容器中提取文檔,通過單擊框1550中的文檔,然后單擊Extract按鈕1530來選擇該文檔。那么,文檔將從容器中取出并存儲(chǔ)在計(jì)算機(jī)的指定目錄中。如果文檔到期,系統(tǒng)將不允許在框1550中選擇該文檔。
如上所述,按照DS容器的另一些實(shí)施例,可以使容器擴(kuò)大和縮小以容納多個(gè)文檔和其它數(shù)字對(duì)象??梢詫⑿碌奈臋n(或其它數(shù)字對(duì)象)增加到容器中,可以對(duì)容器中的現(xiàn)有文檔進(jìn)行更新和刪除,可以將多個(gè)容器合并。容器中的每個(gè)文檔可以具有獨(dú)立的壽命控制和不同的安全等級(jí)。
為了提供這一功能,將DS容器模型化為單個(gè)文件中的虛擬文件系統(tǒng)。虛擬文件系統(tǒng)是一個(gè)作為單個(gè)文件出現(xiàn)在外部世界中的存儲(chǔ)單元,而其內(nèi)部表示實(shí)際上管理著許多個(gè)文件以及它們的控制信息。盡管虛擬文件系統(tǒng)通常包括分層目錄結(jié)構(gòu),但是最好采用平直-單個(gè)目錄-結(jié)構(gòu)作為DS容器。按照本發(fā)明的較佳實(shí)施例,DS容器支持以下操作i)創(chuàng)建新的DS容器;ii)將新的文檔增加到具有獨(dú)立壽命控制和安全性的DS容器中;iii)更新DS容器中的現(xiàn)有文檔,而不改變壽命控制和安全性;iv)更新DS容器中現(xiàn)有文檔的壽命控制或安全性;v)刪除DS容器中的現(xiàn)有文檔;vi根據(jù)DS容器的壽命控制使DS容器中現(xiàn)有文檔失效,并從DS容器中刪除它;vii)銷毀DS容器。
按照本實(shí)施例的DS容器包括容器標(biāo)題(它包括容器的控制信息)和容器中每個(gè)文檔的文檔標(biāo)題。
參考圖10b,按照本實(shí)施例的較佳實(shí)施,容器標(biāo)題包括容器名稱CNAME801、容器的缺省壽命控制DLC 802、創(chuàng)建容器的日期DC 803、最后改動(dòng)容器的日期DM 804、最后訪問容器的日期DLA 805以及容器中的文檔數(shù)目806。圖10(b)示出一個(gè)包括兩個(gè)文檔904.1和904.2的DS容器。每個(gè)文檔的標(biāo)題包括文檔名稱(901.1或901.2)、文檔的壽命控制(902.1或902.2)和文檔的長(zhǎng)度(903.1或903.2)。按照這一實(shí)施例,當(dāng)將文檔增加到容器中時(shí)采用包含在封殼標(biāo)題中的DLC802作為缺省壽命控制。DC 803、DM 804和DLA 805字段允許用戶通過實(shí)施類似于表5(a)視圖方法的例程確定創(chuàng)建容器的日期、最后改動(dòng)容器的日期和最后訪問容器的日期。如果不需要這一功能,自然可以從容器標(biāo)題中省略缺省壽命控制、容器創(chuàng)建、最后改動(dòng)和最后訪問字段。
由于圖10b的DS容器是以與圖10a以及表4a至5b的DS容器的相似方式實(shí)施的,所以,這里將不提供對(duì)本實(shí)施例編程方法的詳細(xì)討論。
參考圖12的流程圖,為了將文檔增加到現(xiàn)有DS容器中,打開現(xiàn)有DS容器(步驟1010),讀出容器標(biāo)題(包括容器名稱、缺省壽命控制、創(chuàng)建日期、最后改動(dòng)日期、最后訪問日期和文檔數(shù)目)。然后,在步驟1030創(chuàng)建被增加新文檔的標(biāo)題,包括文檔名、文檔的壽命控制和文檔長(zhǎng)度。然后將文檔標(biāo)題和文檔自身添加到容器的末端(步驟1040和1050),對(duì)最后訪問、最后改動(dòng)和文檔總數(shù)字段的值進(jìn)行更新(步驟1060),把新的值寫作新的容器標(biāo)題。按照?qǐng)D12的流程圖,更新的容器改寫原始容器。這與表4a至5b的實(shí)施例相反,在表4a至5b的情況中,更新的容器是作為一個(gè)新文件創(chuàng)建的,原始容器接著被刪除。自然,可以將圖10b和13的實(shí)施例修改為采用表4a至5b的方法(即改寫原始容器),反之亦然。
參考圖13所示的流程圖,為了從圖10b的DS容器中提取文檔,打開容器(步驟1110),讀出容器際題。然后,在步驟1120從容器讀出容器中第一個(gè)文檔的文檔標(biāo)題。在步驟1130,將被提取文檔的名稱與文檔名字段901中的名稱進(jìn)行比較,如果它們相同,那么流程繼續(xù)到步驟1140,如果它們不相同,那么流程繼續(xù)到步驟1150。假設(shè)文檔名字段中的當(dāng)前文檔名與請(qǐng)求文檔相同。那么,在步驟1140程序確定該文檔的壽命控制是否有效(即當(dāng)前日期是否在期滿日之后)。如果壽命控制是有效的,那么提取當(dāng)前文檔。如果壽命控制是無效的,那么刪除該文檔。刪除文檔的說明性代碼段如下所示。這里getTotalBytes()的功能從當(dāng)前文檔的文檔標(biāo)題恢復(fù)文檔長(zhǎng)度。
<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>如果當(dāng)前文檔不是請(qǐng)求的文檔,那么在步驟1150程序跳過當(dāng)前文檔的內(nèi)容到下一文檔標(biāo)題或者封殼的末尾。執(zhí)行這一功能的說明性代碼如下所示<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>以這種方式,程序讀過當(dāng)前文檔,從而當(dāng)程序返回到步驟1120時(shí)它設(shè)定為讀出容器中下一個(gè)文檔的文檔標(biāo)題。
已提取文檔后,對(duì)容器標(biāo)題中最后訪問字段進(jìn)行更新(步驟1160),更新的容器標(biāo)題改寫容器標(biāo)題字段801至806(步驟1170),關(guān)閉容器(步驟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然而,應(yīng)當(dāng)注意以上所示的示范實(shí)施例以較為簡(jiǎn)單的圖形用戶接口、簡(jiǎn)單的加密技術(shù)和包括期滿日的壽命控制將基于Java流的方法提供給虛擬容器,應(yīng)當(dāng)注意本發(fā)明包括較寬的附加實(shí)施方案的排列,它們可以是較為簡(jiǎn)單或者是較為復(fù)雜的。在這方面,用戶接口可以包括更復(fù)雜的GUI或者沒有圖形的簡(jiǎn)單命令行接口。同樣,虛擬容器也可以利用Java串行機(jī)制實(shí)現(xiàn)或是可以利用另一種語言,如C++一起實(shí)現(xiàn)。此外,可以將壽命控制修改為多次提取文檔或多次對(duì)文檔進(jìn)行修改的功能。此外,可以將壽命控制用于在規(guī)定期限后將文檔轉(zhuǎn)變?yōu)橹蛔x文檔或者防止文檔被復(fù)制或打印。
虛擬容器的因特網(wǎng)商務(wù)應(yīng)用按照本發(fā)明的另一實(shí)施例,提供一個(gè)采用虛擬容器的因特網(wǎng)商務(wù)系統(tǒng)。按照本實(shí)施例,希望在因特網(wǎng)上出售電子化可傳輸產(chǎn)品的一方利用容器創(chuàng)建實(shí)用工具將產(chǎn)品放置到虛擬容器中,容器創(chuàng)建實(shí)用工具對(duì)產(chǎn)品進(jìn)行加密和設(shè)定產(chǎn)品的壽命控制。在這方面,出售方希望允許可能的買主觀看產(chǎn)品或者在有限的試用期內(nèi)使用該產(chǎn)品,如果沒有購買則在這一試用期后銷毀該產(chǎn)品。希望在購買產(chǎn)品前對(duì)產(chǎn)品進(jìn)行看樣的可能買主從出售方獲得容器的復(fù)制品以及容器開啟實(shí)用工具。容器開啟實(shí)用工具允許買主觀看或使用產(chǎn)品同時(shí)將產(chǎn)品維持在虛擬容器內(nèi)。然而,能夠?qū)⑷萜鏖_啟實(shí)用工具設(shè)置成防止用戶打印該產(chǎn)品(或其任何部分)、復(fù)制該產(chǎn)品(或其任何部分)以及修改該產(chǎn)品,如果買主試圖不使用容器開啟工具觀看產(chǎn)品,他/她將不能對(duì)產(chǎn)品解密。在任何情況中,一旦產(chǎn)品的壽命控制變?yōu)闊o效(即在出售方規(guī)定的時(shí)限之后),采用容器開啟工具打開容器的任何企圖都將導(dǎo)致產(chǎn)品毀壞。應(yīng)當(dāng)注意產(chǎn)品可以是能夠以數(shù)字形式發(fā)送的任何形式的電子媒體,包括例如文檔、照相、圖象和程序。
按照本實(shí)施例的另一方面,買主可以在壽命控制期滿日之前例如通過將他/她的信用卡信息發(fā)送給售主而購買該產(chǎn)品。在收到和/或核實(shí)支付信息后,售主將購買密鑰發(fā)送給買主。容器開啟工具被設(shè)置成能識(shí)別購買密鑰(該密鑰最好是僅針對(duì)發(fā)給該特定買主的產(chǎn)品的特定情況),如果購買密鑰是有效的,允許買主從容器中提取產(chǎn)品。
使用虛擬容器和嵌入式可執(zhí)行模塊的軟件元件在上述的每個(gè)示范實(shí)施例中,以應(yīng)用專用程序已經(jīng)實(shí)現(xiàn)自銷毀文檔,從而用來執(zhí)行自銷毀WordTM文檔的程序不用于執(zhí)行自銷毀ExcelTM文檔的程序。為了避免這一可重復(fù)(再)開發(fā)過程,自銷毀文檔,或在這方面的虛擬容器系統(tǒng)能夠作為軟件元件來實(shí)現(xiàn)。軟件元件是易于再利用的軟件單元,通常提供一種簡(jiǎn)單服務(wù)。
元件對(duì)象模型(COM)是軟件元件技術(shù)的微軟(Microsoft)標(biāo)準(zhǔn)。它定義易于再利用的封裝軟件的標(biāo)準(zhǔn)。通常的COM元件包括兩大類內(nèi)容作為一組方法(功能)實(shí)行的元件的功能性和有關(guān)該元件及其功能性的描述信息??偲饋碚f,這一內(nèi)容被稱為元件接口。應(yīng)當(dāng)注意采用的這一術(shù)語不同于術(shù)語“用戶接口”。用戶接口通常是窗口、菜單、按鈕和允許用戶與應(yīng)用程序功能交互作用的圖形顯示。然而,“接口”更廣泛地是指進(jìn)入軟件(方法或功能)單元的入口點(diǎn)。
能夠采用COM元件來執(zhí)行用戶接口元件,如按鈕和清單。也能夠采用它們來提供不用用戶接口的服務(wù)。例如,COM元件可以提供計(jì)算正弦和余弦函數(shù)的數(shù)學(xué)功能。
盡管元件與對(duì)象之間存在微妙的技術(shù)差別,但是它們都代表兩個(gè)非常相似的概念。照此,本文采用的術(shù)語與貿(mào)易出版和技術(shù)參考材料的慣用語相一致,可以互換。
此外,術(shù)語控制通常用于描述具有與之相關(guān)聯(lián)的用戶接口的元件。具體地說,微軟公司采用術(shù)語ActiveX Control來描述通常具有用戶接口的特定一類COM元件。當(dāng)采用COM元件擴(kuò)展現(xiàn)有應(yīng)用程序的功能時(shí),將該元件說成是嵌入在應(yīng)用程序的文檔中。通常將這種元件稱為嵌入對(duì)象。在這方面,我們注意到Word97TM、ExcelTM、Outlook98TM各自都包括Visual Basic應(yīng)用程序至COM對(duì)象文件庫的支持程序。
采用嵌入對(duì)象技術(shù)實(shí)現(xiàn)應(yīng)用程序擴(kuò)展通常需要將COM元件安裝到文檔作者的計(jì)算機(jī)中。另外,接收文檔復(fù)制件的任何用戶通常也必須將COM元件安裝到他或她的計(jì)算機(jī)中,以實(shí)現(xiàn)擴(kuò)展功能。
通過廣泛努力,虛擬容器的COM元件可以按照如下所述來實(shí)現(xiàn)。
1.首先,指定元件的接口。接口描述元件提供的每一種服務(wù)。在SDE元件的情況中,服務(wù)可以包括CreateEnvelope、AddDocumentToEnvelope和ExtractDocumentFromEnvelope。
2.利用諸如C++、Java和Visual Basic的編程語音實(shí)現(xiàn)元件的每一個(gè)服務(wù)。
3.利用編程語音的開發(fā)工具創(chuàng)建COM元件。
4.將COM元件安裝到用戶的工作站上。實(shí)現(xiàn)調(diào)用元件服務(wù)的少量過程需求。
然而,應(yīng)當(dāng)注意這里描述了微軟公司的COM元件標(biāo)準(zhǔn),也可以采用其它制造商分發(fā)的軟件元件標(biāo)準(zhǔn)。
雖然對(duì)目前認(rèn)為是本發(fā)明較佳實(shí)施例作了描述,但是,本領(lǐng)域的專業(yè)人員在不偏離本發(fā)明精神的條件下能夠?qū)ζ渥鞒龈淖兒透倪M(jìn)。希望所有這些改變都落在本發(fā)明權(quán)利要求的范圍內(nèi)。
權(quán)利要求
1.一種創(chuàng)建自毀文檔的方法,其特征在于所述方法包括以下步驟創(chuàng)建一可執(zhí)行模塊,該模塊指令計(jì)算機(jī)改寫和/或刪除所述可執(zhí)行模塊附加到其上的文檔;將所述可執(zhí)行模塊附加到所述文檔上。
2.如權(quán)利要求1所述的方法,其特征在于所述可執(zhí)行模塊是可執(zhí)行的代碼。
3.如權(quán)利要求1所述的方法,其特征在于所述可執(zhí)行模塊是可執(zhí)行的程序。
4.如權(quán)利要求1所述的方法,其特征在于所述可執(zhí)行模塊是宏指令。
5.如權(quán)利要求1所述的方法,其特征在于所述方法進(jìn)一步包括在打開所述文檔時(shí)執(zhí)行所述可執(zhí)行模塊的步驟。
6.一種自毀電子郵件發(fā)報(bào)系統(tǒng),其特征在于所述系統(tǒng)包括可執(zhí)行模塊,該模塊配置成指令計(jì)算機(jī)刪除所述可執(zhí)行模塊附加到其上的報(bào)文;電子郵件發(fā)報(bào)系統(tǒng),所述電子郵件發(fā)報(bào)系統(tǒng)配置成創(chuàng)建一電子郵件報(bào)文并發(fā)送所述電子郵件報(bào)文,所述電子郵件發(fā)報(bào)系統(tǒng)在發(fā)送前將所述可執(zhí)行模塊附加到所述電子郵件報(bào)文上。
7.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊是可執(zhí)行的代碼。
8.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊是可執(zhí)行的程序。
9.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊是宏指令。
10.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊配置成采用空字符改寫所述消息。
11.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊配置成指令所述計(jì)算機(jī)在出現(xiàn)預(yù)定條件時(shí)刪除所述電子郵件報(bào)文。
12.如權(quán)利要求11所述的系統(tǒng),其特征在于所述預(yù)定條件是指日期。
13.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊配置成在打開附加所述可執(zhí)行模塊的所述電子郵件時(shí)執(zhí)行。
14.如權(quán)利要求6所述的系統(tǒng),其特征在于所述可執(zhí)行模塊配置成在打開附加所述可執(zhí)行模塊的所述電子郵件時(shí)開始執(zhí)行,如果滿足預(yù)定條件在所述執(zhí)行過程期間所述可執(zhí)行模塊刪除所述報(bào)文。
15.如權(quán)利要求6所述的系統(tǒng),其特征在于所述電子郵件報(bào)文是電子郵件報(bào)文附件。
16.如權(quán)利要求15所述的系統(tǒng),其特征在于所述可執(zhí)行模塊配置成指令所述計(jì)算機(jī)在出現(xiàn)預(yù)定條件時(shí)刪除所述電子郵件報(bào)文附件。
17.如權(quán)利要求16所述的系統(tǒng),其特征在于所述預(yù)定條件是指所述電子郵件報(bào)文的打印、復(fù)制或轉(zhuǎn)送。
18.如權(quán)利要求1所述的方法,其特征在于所述文檔是指加密文檔,所述可執(zhí)行模塊配置成指令所述計(jì)算機(jī)若滿足預(yù)定條件則對(duì)所述文檔進(jìn)行解密,若不滿足所述預(yù)定條件則刪除所述文檔。
19.如權(quán)利要求6所述的方法,其特征在于所述文檔是指加密文檔,所述可執(zhí)行模塊配置成指令所述計(jì)算機(jī)若滿足預(yù)定條件則對(duì)所述報(bào)文進(jìn)行解密,若不滿足所述預(yù)定條件則刪除所述報(bào)文。
20.一種創(chuàng)建含有數(shù)字對(duì)象的虛擬容器的方法,其特征在于所述方法包括以下步驟創(chuàng)建一虛擬容器,所述虛擬容器駐留在計(jì)算機(jī)電子存儲(chǔ)媒體的鄰接位置中,所述虛擬容器包括標(biāo)題部分和數(shù)字對(duì)象部分;選擇插入到所述虛擬容器中的數(shù)字對(duì)象;將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象,以創(chuàng)建一加密數(shù)字對(duì)象;選擇所述數(shù)字對(duì)象的期滿日;將所述期滿日的信息指示寫入所述虛擬容器的所述標(biāo)題部分。
21.一種從虛擬容器提取文檔的方法,其特征在于所述方法包括以下步驟從虛擬容器的標(biāo)題部分讀出期滿日的信息指示,所述虛擬容器駐留在計(jì)算機(jī)電子存儲(chǔ)媒體的鄰接位置中,所述虛擬容器包括標(biāo)題部分和數(shù)字對(duì)象部分,所述數(shù)字對(duì)象部分包括加密數(shù)字對(duì)象;根據(jù)所述信息確定所述電子對(duì)象是否到期;如果所述電子對(duì)象到期,用空數(shù)據(jù)改寫所述虛擬容器中的數(shù)字對(duì)象部分;如果所述數(shù)字對(duì)象不到期,從所述數(shù)字對(duì)象部分讀出所述數(shù)字對(duì)象并將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象。
22.一種虛擬容器系統(tǒng),其特征在于所述系統(tǒng)包括一容器創(chuàng)建實(shí)用工具,所述容器創(chuàng)建實(shí)用工具創(chuàng)建一虛擬容器,它駐留在計(jì)算機(jī)電子存儲(chǔ)媒體的鄰接位置中,這里,所述虛擬容器包括標(biāo)題部分和數(shù)字對(duì)象部分,容器開啟實(shí)用工具接收用戶的數(shù)字對(duì)象選擇和期滿日選擇,容器創(chuàng)建工具將加密技術(shù)運(yùn)用于所選數(shù)字對(duì)象上以創(chuàng)建加密數(shù)字對(duì)象并將所述加密數(shù)字對(duì)象寫入到所述虛擬容器的所述數(shù)字對(duì)象部分中,容器創(chuàng)建工具將所述期滿日的信息指示寫入到所述虛擬容器的所述標(biāo)題部分中;容器開啟實(shí)用工具,所述容器開啟實(shí)用工具從所述虛擬容器的所標(biāo)題部分讀出所述期滿日的指示信息,所述容器開啟工具根據(jù)所述信息確定所述電子對(duì)象是否到期,如果所述電子對(duì)象到期,所述容器開啟工具用零數(shù)據(jù)改寫所述虛擬容器中的數(shù)字對(duì)象部分;如果所述數(shù)字對(duì)象不到期,所述容器開啟工具從所述數(shù)字對(duì)象部分讀出所述數(shù)字對(duì)象并將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象。
23.一種創(chuàng)建虛擬容器和從虛擬容器中提取數(shù)字對(duì)象的方法,其特征在于創(chuàng)建所述虛擬容器的方法包括以下步驟創(chuàng)建一虛擬容器,所述虛擬容器駐留在計(jì)算機(jī)電子存儲(chǔ)媒體的鄰接位置中,所述虛擬容器包括標(biāo)題部分和數(shù)字對(duì)象部分;選擇插入到所述虛擬容器中的數(shù)字對(duì)象;將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象,以創(chuàng)建一加密數(shù)字對(duì)象;將所述加密數(shù)字對(duì)象寫入所述數(shù)字對(duì)象部分;選擇所述數(shù)字對(duì)象的期滿日;將所述期滿日的指示信息寫入所述虛擬容器的所述標(biāo)題部分;從所述虛擬容器中提取文檔的方法包括以下步驟從虛擬容器的標(biāo)題部分讀出期滿日的指示信息;根據(jù)所述信息確定所述電子對(duì)象是否到期;如果所述電子對(duì)象到期,用空數(shù)據(jù)改寫所述虛擬容器中的數(shù)字對(duì)象部分;如果所述數(shù)字對(duì)象不到期,從所述數(shù)字對(duì)象部分讀出所述數(shù)字對(duì)象并將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象。
24.如權(quán)利要求20所述的方法,其特征在于創(chuàng)建虛擬容器的所述步驟包括創(chuàng)建容器標(biāo)題和數(shù)字對(duì)象標(biāo)題的步驟,所述容器標(biāo)題包括涉及所述容器的信息,如容器名稱,所述數(shù)字對(duì)象標(biāo)題包括涉及所述數(shù)字對(duì)象的信息,如數(shù)字對(duì)象名稱。
25.如權(quán)利要求24所述的方法,其特征在于寫入所述期滿日的指示信息的所述步驟包括把所述信息寫入所述容器標(biāo)題中。
26.如權(quán)利要求24所述的方法,其特征在于寫入所述期滿日的指示信息的所述步驟包括把所述信息寫入所述數(shù)字對(duì)象標(biāo)題中。
27.如權(quán)利要求24所述的方法,其特征在于選擇插入到所述虛擬容器中的數(shù)字對(duì)象的步驟包括多個(gè)選擇插入到所述虛擬容器中的數(shù)字對(duì)象;運(yùn)用加密技術(shù)的步驟包括將加密技術(shù)運(yùn)用于所述多個(gè)數(shù)字對(duì)象中的每一個(gè);將所述加密數(shù)字對(duì)象寫入到所述數(shù)字對(duì)象部分中的步驟包括將每個(gè)所述加密數(shù)字對(duì)象寫入到所述數(shù)字對(duì)象部分中;選擇期滿日的步驟包括選擇多個(gè)數(shù)字對(duì)象中每一個(gè)的期滿日;以及寫入信息的步驟包括將每一個(gè)數(shù)字對(duì)象的期滿日的信息指示寫入到各自的數(shù)字對(duì)象標(biāo)題中。
28.如權(quán)利要求23所述的方法,其特征在于創(chuàng)建虛擬容器的所述步驟包括創(chuàng)建容器標(biāo)題和數(shù)字對(duì)象標(biāo)題的步驟,所述容器標(biāo)題包括涉及所述容器的信息,如容器名稱,所述數(shù)字對(duì)象標(biāo)題包括涉及所述數(shù)字對(duì)象的信息,如數(shù)字對(duì)象名稱。
29.如權(quán)利要求28所述的方法,其特征在于寫入所述期滿日的指示信息的所述步驟包括把所述信息寫入所述容器標(biāo)題中。
30.如權(quán)利要求28所述的方法,其特征在于寫入所述期滿日的指示信息的所述步驟包括把所述信息寫入所述數(shù)字對(duì)象標(biāo)題中。
31.如權(quán)利要求2所述的方法,其特征在于選擇插入到所述虛擬容器中的數(shù)字對(duì)象的步驟包括選擇多個(gè)插入到所述虛擬容器中的數(shù)字對(duì)象;運(yùn)用加密技術(shù)的步驟包括將加密技術(shù)運(yùn)用于所述多個(gè)數(shù)字對(duì)象中的每一個(gè);將所述加密數(shù)字對(duì)象寫入到所述數(shù)字對(duì)象部分中的步驟包括將每個(gè)所述加密數(shù)字對(duì)象寫入到所述數(shù)字對(duì)象部分中;選擇期滿日的步驟包括選擇多個(gè)數(shù)字對(duì)象中每一個(gè)的期滿日;以及寫入信息的步驟包括將每一個(gè)數(shù)字對(duì)象的期滿日的信息指示寫入到各自的數(shù)字對(duì)象標(biāo)題中。
32.一種將可銷毀數(shù)字對(duì)象發(fā)送給收件人的方法,其特征在于所述方法包括以下步驟創(chuàng)建一虛擬容器,所述虛擬容器駐留在計(jì)算機(jī)電子存儲(chǔ)媒體的鄰接位置中,所述虛擬容器包括標(biāo)題部分和數(shù)字對(duì)象部分;選擇插入到所述虛擬容器中的數(shù)字對(duì)象;將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象,以創(chuàng)建一加密數(shù)字對(duì)象;將所述加密數(shù)字對(duì)象寫入到所述數(shù)字對(duì)象部分中;選擇所述數(shù)字對(duì)象的期滿日;將所述期滿日的信息指示寫入所述虛擬容器的所述標(biāo)題部分,將所述虛擬容器和容器開啟實(shí)用工具發(fā)送給收件人,這里,所述容器開啟實(shí)用工具在被收件人調(diào)用時(shí)從虛擬容器的標(biāo)題部分讀出期滿日的指示信息,根據(jù)所述信息確定所述電子對(duì)象是否到期,如果所述電子對(duì)象到期,用空數(shù)據(jù)改寫所述虛擬容器中的數(shù)字對(duì)象部分,如果所述數(shù)字對(duì)象不到期,從所述數(shù)字對(duì)象部分讀出所述數(shù)字對(duì)象并將加密技術(shù)運(yùn)用于所述數(shù)字對(duì)象。
33.如權(quán)利要求32所述的方法,其特征在于所述虛擬容器是經(jīng)因特網(wǎng)發(fā)送的。
34.如權(quán)利要求27所述的方法,其特征在于所述標(biāo)題部分包括所述容器標(biāo)題部分和所述數(shù)字對(duì)象部分,每個(gè)數(shù)字對(duì)象在所述虛擬容器中處于與其各自數(shù)字對(duì)象標(biāo)題相鄰的位置。
35.如權(quán)利要求31所述的方法,其特征在于所述標(biāo)題部分包括所述容器標(biāo)題部分和所述數(shù)字對(duì)象部分,每個(gè)數(shù)字對(duì)象在所述虛擬容器中處于與其各自數(shù)字對(duì)象相鄰的位置。
36.如權(quán)利要求21所述的方法,其特征在于所述數(shù)字對(duì)象是文檔。
37.如權(quán)利要求22所述的方法,其特征在于所述數(shù)字對(duì)象是文檔。
38.如權(quán)利要求23所述的方法,其特征在于所述數(shù)字對(duì)象是文檔。
39.如權(quán)利要求32所述的方法,其特征在于所述數(shù)字對(duì)象是文檔。
40.如權(quán)利要求21所述的方法,其特征在于所述數(shù)字對(duì)象是程序。
41.如權(quán)利要求22所述的方法,其特征在于所述數(shù)字對(duì)象是程序。
42.如權(quán)利要求23所述的方法,其特征在于所述數(shù)字對(duì)象是程序。
43.如權(quán)利要求32所述的方法,其特征在于所述數(shù)字對(duì)象是程序。
全文摘要
提供了一種自毀文檔或電子郵件發(fā)報(bào)系統(tǒng),該系統(tǒng)通過把宏或病毒附加到文檔或電子郵件報(bào)文,以在預(yù)定的時(shí)間自動(dòng)地銷毀文檔或電子郵件報(bào)文。產(chǎn)生(220)宏,并在它產(chǎn)生時(shí)把它附加(230)到諸如電子郵件報(bào)文(280)或文檔(270)等文件。宏包含可執(zhí)行代碼或可執(zhí)行程序的一部分,它指令計(jì)算機(jī)在所需的時(shí)間改寫和/或刪除附加了病毒的文件。
文檔編號(hào)G06Q10/00GK1229489SQ98800856
公開日1999年9月22日 申請(qǐng)日期1998年6月16日 優(yōu)先權(quán)日1997年6月17日
發(fā)明者H·R·烏德爾, S·D·貝克, C·S·卡普爾, G·M·舍曼, W·里斯 申請(qǐng)人:珀杜法爾瑪Lp公司