国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種文檔數(shù)據(jù)安全管理系統(tǒng)和方法

      文檔序號:6651393閱讀:233來源:國知局
      專利名稱:一種文檔數(shù)據(jù)安全管理系統(tǒng)和方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及一種對文檔數(shù)據(jù)進行處理的系統(tǒng),特別涉及特別是涉及一種文檔數(shù)據(jù)安全管理系統(tǒng)和方法。
      背景技術(shù)
      目前關(guān)于各種非結(jié)構(gòu)化文檔的軟件已經(jīng)比較普及,形成了多種文檔格式林立的狀況。例如,一個內(nèi)容管理軟件往往要處理二三百種文檔格式,而且這些格式還在不斷更新,給軟件開發(fā)商帶來了巨大的困難。如何解決文檔通用性、進行數(shù)字內(nèi)容提取、格式兼容越來越成為人們的關(guān)注點,人們迫切希望解決以下問題1)文檔不通用基本上只能用同一種軟件在不同的人之間交換文檔,但不能在不同的軟件之間互相交換文檔,形成信息封閉。
      2)文檔信息提取困難文檔描述信息豐富,數(shù)據(jù)結(jié)構(gòu)復(fù)雜,實現(xiàn)難度較大。每一家公司都把自己的書面文檔描述作為獨家特有技術(shù)、基本上不提供開放接口。
      3)訪問接口不統(tǒng)一、數(shù)據(jù)兼容困難或代價太高不同的文檔處理軟件之間,文件格式互不兼容,在處理過程中要么利用對方組件解析(前提是對方提供相應(yīng)接口),要么自己投入研發(fā)力量從頭到尾的解析對方的格式。
      4)信息安全較差目前針對書面文檔的權(quán)限控制手段單一,主要是數(shù)據(jù)加密、口令認證。因為信息泄露,每年造成巨大損失的公司案例層出不窮。
      5)都是針對單個文檔的處理,缺乏多文檔管理手段每個人電腦中都有大量文檔,但多個文檔之間缺乏有效的組織管理,而且資源共享很難。如,字庫/字體文件、全文數(shù)據(jù)檢索等
      6)行業(yè)競爭層次還停留在各自格式描述之爭上由于書面文檔數(shù)據(jù)結(jié)構(gòu)復(fù)雜、數(shù)據(jù)描述豐富、文檔數(shù)據(jù)長度不確定,每一個文檔都千差萬別。長期以來,大家都在關(guān)注文檔格式標準,各大公司都努力將自己特有的文檔格式發(fā)展為市場標準,各標準組織也致力于制訂通用的文檔格式標準。但不管是專有的文檔格式(如.doc)還是開放的文檔格式(如PDF),只要是以文檔格式為標準,就不可避免產(chǎn)生以下問題a)重復(fù)開發(fā),效果不統(tǒng)一使用同一標準的不同軟件都需要自己去解釋、生成該格式的文檔,造成大量重復(fù)開發(fā),而且會因為各家解釋程序不同,有的完善有的相對簡單,有的支持新版本有的只支持舊版本數(shù)據(jù),同一文檔在不同軟件下顯現(xiàn)出不同的版式,甚至出現(xiàn)解釋錯誤無法打開。
      b)阻礙創(chuàng)新軟件是不斷創(chuàng)新的行業(yè),但由于每增加一個新功能就需要增加描述該功能的信息,但只有等到標準修訂的時候才能增加新的格式,因此把存儲格式固定死之后,將會妨礙技術(shù)創(chuàng)新的競爭。
      c)影響性能對海量信息,需要增加大量的檢索信息以提高檢索性能,但固定死的存儲格式難以增加檢索信息d)影響可移植性和可伸縮性在不同的系統(tǒng)環(huán)境下,不同的應(yīng)用需求,可能會有不同的存儲要求。例如,存儲在硬盤上就需要考慮如何減少磁頭尋道的次數(shù)以提高性能,而在嵌入式應(yīng)用中數(shù)據(jù)都相當于存儲在內(nèi)存中的,就不存在這個問題。事實上,數(shù)據(jù)庫軟件也往往都是這樣設(shè)計的,同一個廠商的數(shù)據(jù)庫軟件在不同平臺上就可能會使用不同的存儲格式。因此,設(shè)置文檔存儲標準將會影響系統(tǒng)的可移植性和可伸縮性。
      7)頁面分層的技術(shù)不完善目前一些軟件,如Adobe的photoshop,Microsoft的word,多多少少已經(jīng)有層的概念,但層的功能還比較單一,管理手段比較簡單,不能滿足應(yīng)用需求
      8)檢索手段還不夠豐富隨著信息的海量化,用任何一個關(guān)鍵詞來搜索都會得到數(shù)量龐大的檢索結(jié)果,全文檢索技術(shù)基本解決了查全率的問題,但查準率迅速上升為首要問題。現(xiàn)有技術(shù)還沒有很充分地利用全部信息來解決查準率問題,例如每個文字的字體、字號完全可以用來判斷該文字的重要性,但都在檢索時被忽略了。
      事實上,一種文檔格式不管是否開放,最后結(jié)果往往都是被特定軟件所壟斷。商業(yè)實踐的結(jié)果證明,不管是.doc這種已經(jīng)被無數(shù)的同行研究得比較透、大家都花了巨大的精力和人力物力去兼容的文檔格式,還是PDF這種完全公開的文檔格式,在實際應(yīng)用中用戶還是會選擇用原廠商的軟件(即MSWord和Adobe Acrobat)來處理,而不太愿意用第三方的軟件。一種文檔格式被特定軟件所壟斷會造成信息流不暢通,非常不利于進行信息化建設(shè),而且還會造成用戶過分集中到大軟件公司的軟件上,形成對用戶不利的壟斷。例如,MS Office的表格功能不夠好,但即使有人開發(fā)了非常好用的表格編輯軟件,也很難在市場上生存,因為基本上沒有哪個文檔通篇只有表格,這樣用戶還只能使用那些功能比較全的軟件,盡管其中的表格功能并不好用,因此市場就被MS Office這種全能軟件所壟斷,大量中小軟件公司開發(fā)的“專而不全”的軟件缺乏市場空間。
      現(xiàn)有技術(shù)中最開放、可交換性最好的是Adobe Acrobat采用的PDF。PDF已經(jīng)成為全球分檔分發(fā)、交換的事實標準,但也只能在不同的人之間交換文檔,不能在不同的軟件之間交換文檔,即不能實現(xiàn)文檔的互操作性。而且不管是Acrobat,還是Office,都只能對單文檔進行處理,缺乏對多文檔的管理功能,不具備對文檔庫進行操作的功能。
      在文檔信息安全方面,現(xiàn)有技術(shù)也存在較多缺陷。Word和PDF這些應(yīng)用最廣泛的文檔,都是采用對數(shù)據(jù)加密或者口令認證等進行數(shù)據(jù)安全控制,沒有提供系統(tǒng)的身份認證機制,對權(quán)限的控制都是整個文檔范圍的,不能細化到文檔內(nèi)的任意區(qū)域,對邏輯數(shù)據(jù)指定加密和簽名是受限的,無法對任意邏輯數(shù)據(jù)設(shè)定加密和簽名。內(nèi)容管理系統(tǒng)雖然能夠提供很好的身份認證機制,但由于與文檔處理系統(tǒng)是分離的,不能在核心層集成,不僅管理粒度只能做到文檔級,而且在文檔使用過程中就脫離了內(nèi)容管理系統(tǒng)的安全控制,難以進行必要的安全管理。通常情況下,安全機制與文檔處理是分離的模塊,容易出現(xiàn)安全縫隙。
      下面介紹本發(fā)明中會涉及到的一些安全管理方面的現(xiàn)有技術(shù)和概念非對稱密鑰加密算法也叫公開密鑰體系(Public Key Infrastructure,PKI)算法,由美國斯坦福大學赫爾曼教授于1977年提出。它主要指加密密鑰和解密密鑰不相同,而且相互之間不存在推導關(guān)系,用戶公開其中一個密鑰不會泄漏另一把密鑰。這樣其他人可以用公鑰對發(fā)送的信息進行加密,安全地傳送到該用戶,然后由該用戶用自己的私鑰進行解密。PKI技術(shù)解決了密鑰的發(fā)布和管理問題,是目前常用的密碼技術(shù)。使用PKI技術(shù),進行數(shù)據(jù)通信的雙方可以安全地確認對方身份和公開密鑰,提供通信的可鑒別性。目前,常用的PKI算法有橢圓曲線密碼加密算法(Elliptic Curves Cryptography,ECC),RSA加密算法(Ron Rivest,Adi Shamir,LenAdleman公私鑰算法)等。
      RSA算法描述如下公鑰n=pq,(p,q為兩個不同的很大的質(zhì)數(shù),p和q必須保密)將(p-1)和(q-1)相乘得到φ(n)選擇一個整數(shù)e(1<e<φ(n))與φ(n)互質(zhì)私鑰d=e-1modφ(n),即計算一個數(shù)字d,使得它滿足公式de=1 modφ(n)加密c=mc(mod n)解密m=cd(mod n),m為明文,c為密文。
      橢圓曲線密碼加密算法(ECC)是另一種非對稱密鑰加密算法,橢圓曲線用于密碼算法,于1985年由Koblitz和Victor Miller分別獨立地提出。它問世以來一直是密碼分析學的研究對象。現(xiàn)在,在商業(yè)和政府的用途中,橢圓曲線密碼系統(tǒng)(ECC)都被認為是安全的。根據(jù)已知的密碼分析學知識,橢圓曲線密碼系統(tǒng)相比于傳統(tǒng)的密碼系統(tǒng)來說提供了更高的安全性。
      ECC加密算法描述如下大素數(shù)域上的橢圓曲線可通過同構(gòu)映射將一般的曲線方程變換為特別簡單的形式y(tǒng)2=x3+ax+b,其中曲線參數(shù)a,b∈Fp并且滿足4a3+27b2≠0(modp)。
      因此,滿足下列方程的所有點(x,y),再加上無窮遠點O∞,構(gòu)成一條定義在大素數(shù)域Fp上的橢圓曲線。
      Y2=x3+ax+b(mod p)其中x,y屬于0到p-1間的大素數(shù),并將這條橢圓曲線記為Ep(a,b)。
      考慮如下等式K=kG[其中K,G為Ep(a,b)上的點,k為小于n(n是點G的階)的整數(shù),不難發(fā)現(xiàn),給定k和G,根據(jù)加法法則,計算K很容易;但給定K和G,求k就相當困難了。
      這就是橢圓曲線密碼系統(tǒng)基于的數(shù)學難題。把點G稱為基點(basepoint),k(k<n,n為基點G的階)稱為私有密鑰(private key),K稱為公開密鑰(public key)。
      加密算法還可以是公知的對稱算法,對稱算法就是指加密和解密過程均采用同一把密鑰。如AES算法。
      AES算法是1997年1月由NIST提出的,其目的是開發(fā)一種新的能保證政府信息安全的編碼算法。最后經(jīng)過多方評估從15種算法中選出Rijndael算法作為AES編碼標準算法。AES算法是對稱加密的迭代分組密碼。它把數(shù)據(jù)塊分成比特陣列,每一項密碼操作都是面向比特的。Rijndael算法分為四層,第一層是8×8比特置換(即輸入8比特,輸出8比特);第二、三層是線性混合層(陣列的行移位、列混合);第四層是子密鑰與陣列的每比特異或。
      AES的分組長度為128比特,密鑰長度為128/192/256比特,相對應(yīng)的輪數(shù)r為10/12/14,相應(yīng)的密鑰方案為在加密的過程中,需要r+1個子密鑰,需要構(gòu)造4(r+1)個32比特字。當種子密鑰為128和192比特時,構(gòu)造4(r+1)個32比特字的過程是一樣的。但當種子密鑰為256比特時,構(gòu)造4(r+1)個32比特字的過程是不同的。
      HASH也稱為散列或消息摘要或數(shù)字摘要,就是通過把單向HASH函數(shù)應(yīng)用于信息,將任意長度的一塊數(shù)據(jù)轉(zhuǎn)換為一段定長的、不可逆轉(zhuǎn)的數(shù)據(jù),稱為該數(shù)據(jù)的HASH值。從理論上講,任何HASH算法,產(chǎn)生碰撞(即兩塊不同的數(shù)據(jù)具有相同的HASH值)是必然的。HASH算法的安全性有兩層含義一是由HASH值不能反推出原數(shù)據(jù);二是要構(gòu)造兩塊具有相同HASH值的不同的數(shù)據(jù)在計算上是不可行的,盡管理論上是存在的。目前MD5、SHA1和SHA256被認為是比較安全的HASH算法。另一方面,HASH函數(shù)的計算一般都比較快,相對簡單。
      并集是指多個集合的所有元素組成的集合。
      設(shè)A、B為兩集合,若A中任意的元素x都屬于B,則稱B為A的超集,稱A為B的子集發(fā)明內(nèi)容本發(fā)明是為了克服上述文檔中的安全缺陷而提供的一種文檔數(shù)據(jù)安全管理系統(tǒng)和方法,其具有強大的嵌入式信息安全功能,在核心層緊密結(jié)合信息安全技術(shù),為文檔提供最大程度的安全性。
      為實現(xiàn)本發(fā)明目的而提供的一種文檔數(shù)據(jù)安全管理系統(tǒng),包括文檔數(shù)據(jù),其特征在于,還包括角色管理單元、安全會話通道單元角色管理單元包括至少一個角色,用于角色的創(chuàng)建、各角色的權(quán)限的授權(quán)、收回授權(quán);安全會話通道單元包括至少一個會話密鑰和至少一個安全會話通道,用于加密在安全會話通道之間傳遞的數(shù)據(jù);角色會話通過安全會話通道單元中的安全會話通道進行。
      所述角色由至少一個唯一的序列號和至少一對唯一的PKI密鑰組成。
      文檔數(shù)據(jù)安全管理系統(tǒng),還可以包括身份認證單元,用于當角色登錄時,對登錄的身份進行認證,只有擁有角色的私鑰才能以這個角色的身份登錄。
      訪問控制單元,用于對文檔數(shù)據(jù)設(shè)置訪問控制權(quán)限,角色只能根據(jù)自己的訪問控制權(quán)限訪問文檔數(shù)據(jù)。
      簽名單元,用于對文檔數(shù)據(jù)的任意指定的邏輯數(shù)據(jù)進行簽名,角色利用私鑰通過文檔數(shù)據(jù)簽名單元中的簽名,驗證在邏輯數(shù)據(jù)中角色簽名的合法性。
      本發(fā)明還提供了一種文檔數(shù)據(jù)安全管理方法,包括下列步驟步驟A安全會話通道單元建立安全會話通道,啟動會話;步驟B角色登錄;
      步驟C新建文檔數(shù)據(jù)時,角色管理單元將該文檔數(shù)據(jù)的缺省角色的權(quán)限設(shè)置為擁有所有權(quán)限;步驟D創(chuàng)建新角色;步驟E對角色授與對對象的權(quán)限;步驟F收回角色對對象的權(quán)限;步驟G讀取對象;步驟H寫對象;步驟I對對象進行簽名;步驟J注銷登錄角色;步驟K結(jié)束會話。
      所述步驟C中所述的權(quán)限為對所有對象的讀、寫、再授權(quán)和收回授權(quán)權(quán)限。
      所述步驟A包括下列步驟A1)根據(jù)會話標志判斷是否已經(jīng)啟動會話,如果是,則完成建立安全會話通道的過程,否則繼續(xù);A2)一方生成一對隨機PKI鑰對;A3)將公鑰發(fā)送給對方;A4)對方生成隨機對稱密鑰作為會話密鑰,并用該公鑰加密會話密鑰后傳回;A5)用私鑰解密出會話密鑰;A6)設(shè)置會話標志。
      所述步驟B包括下列步驟B1)應(yīng)用軟件提供所要登錄角色的ID和所登錄的文檔數(shù)據(jù);B2)身份認證單元檢查會話中的登錄角色列表,如果該角色已經(jīng)登錄,則該步驟已經(jīng)完成,否則繼續(xù);B3)身份認證單元取出存儲在角色對象中的角色公鑰;B4)身份認證單元生成一段隨機數(shù)據(jù)塊,用該角色的公鑰對該數(shù)據(jù)塊進行加密;B5)身份認證單元將加密后的數(shù)據(jù)塊發(fā)送給應(yīng)用軟件;
      B6)應(yīng)用軟件用該角色的私鑰進行解密,將解密后的數(shù)據(jù)發(fā)送給身份認證單元;B7)身份認證單元判斷傳回的數(shù)據(jù)是否正確,如果不正確則登錄失敗,否則繼續(xù);B8)在會話的登錄角色列表中增加該角色;所述步驟D包括下列步驟D1)應(yīng)用軟件發(fā)出創(chuàng)建新角色指令;D2)角色管理單元生成一個唯一的角色ID號;D3)角色管理單元生成一對隨機的PKI鑰對;D4)角色管理單元在文檔數(shù)據(jù)中創(chuàng)建一個角色對象,在角色對象中存儲上述ID號和公鑰,該角色的權(quán)限為空;D5)將ID號和私鑰返回給應(yīng)用軟件。
      所述步驟E包括下列步驟E1)應(yīng)用軟件發(fā)出授權(quán)請求;E2)角色管理單元計算登錄角色列表中所有角色對對象的權(quán)限的并集,判斷該并集是否是權(quán)限的超集并同時擁有再授權(quán)權(quán)限,如果否,則授權(quán)失??;否則繼續(xù);E3)角色管理單元將對對象的權(quán)限增加到角色的權(quán)限列表中。如果權(quán)限不包含讀或?qū)懙臋?quán)限,則授權(quán)完成;否則繼續(xù);E4)訪問控制單元單元檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限,如果是,則從當前登錄的角色中,選擇對對象具備相應(yīng)權(quán)限的角色;E5)將該角色權(quán)限列表中對象的對應(yīng)密鑰的密文,發(fā)送給應(yīng)用軟件;E6)應(yīng)用軟件用該角色的私鑰解密出密鑰,返回給訪問控制單元;E7)根據(jù)權(quán)限的設(shè)定,使用角色的公鑰,加密相應(yīng)的密鑰,生成對應(yīng)的密文,并存儲到角色的權(quán)限列表中;所述步驟E4還包括下列步驟步驟E41)生成隨機對稱密鑰和隨機PKI密鑰;步驟E42)用對稱密鑰對對象進行加密;如果對象的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則該子對象保持不變;
      步驟E43)用PKI加密密鑰加密對稱密鑰,存儲加密后的密文,并對對象進行簽名;步驟E44)檢查文檔數(shù)據(jù)中的所有角色,凡是對對象具有讀權(quán)限的,用該角色的公鑰對解密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中;凡是對對象具有寫權(quán)限的,用該角色的公鑰對加密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中;步驟E45)轉(zhuǎn)到步驟E5。
      所述步驟F包括下列步驟F1)應(yīng)用軟件發(fā)出收回授權(quán)請求;F2)角色管理單元查找登錄角色列表中的所有角色,是否有對對象的收回授權(quán)的權(quán)限。如果都沒有,則收回授權(quán)失敗,否則繼續(xù);F3)從角色對對象的權(quán)限中去掉該權(quán)限;F4)如果權(quán)限包含讀或?qū)憴?quán)限,從角色的權(quán)限列表中刪除對對象的相應(yīng)解密密鑰和/或加密密鑰。
      所述步驟G包括下列步驟G1)應(yīng)用軟件發(fā)出需要讀取對象的操作的指令G2)訪問控制單元檢查登錄角色列表中所有角色對對象的權(quán)限,確認是否至少有一個角色對對象有讀權(quán)限;如果均無,則失?。环駝t繼續(xù);G3)檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限;如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象;G4)選擇一個對該對象有讀權(quán)限的角色;G5)將該角色權(quán)限列表中保存的該對象的解密密鑰的密文,發(fā)送給應(yīng)用軟件;G6)應(yīng)用軟件用該角色的私鑰解密出解密密鑰,返回給訪問控制單元;G7)訪問控制單元用該解密密鑰解密出該對象的對稱密鑰;G8)用該對稱密鑰解密出對象的數(shù)據(jù);G9)將解密后的數(shù)據(jù)返回給與應(yīng)用軟件。
      所述步驟H包括下列步驟
      H1)應(yīng)用軟件發(fā)出需要修改對象的操作的指令;H2)訪問控制單元檢查登錄角色列表中所有角色對對象的權(quán)限,確認是否至少有一個角色對對象有寫權(quán)限;如果均無,則失??;否則繼續(xù);H3)檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限;如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象;H4)選擇一個對對象有寫權(quán)限的角色;H5)將該角色權(quán)限列表中保存的對象的加密密鑰的密文,發(fā)送給應(yīng)用軟件;H6)應(yīng)用軟件用該角色的私鑰解密出對象的加密密鑰,返回給訪問控制單元;H7)用該加密密鑰加密對象的新數(shù)據(jù);H8)用加密后的數(shù)據(jù)覆蓋原數(shù)據(jù),完成寫入過程。
      所述步驟I包括下列步驟I1)應(yīng)用軟件發(fā)出對對象進行簽名的指令;I2)訪問控制單元對對象的數(shù)據(jù)進行正則化;I3)計算正則化結(jié)果的HASH值;I4)將HASH值發(fā)給應(yīng)用軟件;I5)應(yīng)用軟件用登錄角色列表中所有角色的私鑰對該HASH值進行加密;I6)應(yīng)用軟件將簽名結(jié)果返回給訪問控制單元;I7)訪問控制單元將簽名結(jié)果保存在數(shù)字簽名對象中。
      所述步驟I2包括下列步驟I21)計算樹的一結(jié)點的正則結(jié)果;I22)從子樹的根節(jié)點開始,按照上述方法計算該結(jié)點的正則結(jié)果,并對其所有子結(jié)點,按照從左到右順序依次計算其正則結(jié)果,將子結(jié)點的正則結(jié)果按順序附加到父結(jié)點正則結(jié)果之后;I23)這是一個深度優(yōu)先的遞歸過程,遞歸結(jié)束之后,即得到最終結(jié)果;I24)如果需要對被引用的對象也一起做簽名,則可以將被引用對象也作為一個子結(jié)點處理。
      本發(fā)明改變了文檔的操作從用戶界面到文檔存儲都由一個軟件來完成的現(xiàn)狀,將文檔操作劃分為應(yīng)用軟件和文檔庫系統(tǒng)兩層,并定義了一個接口標準。文檔庫系統(tǒng)是具備各種文檔操作功能的通用技術(shù)平臺,并具有符合該標準的接口部,應(yīng)用軟件要對文檔進行操作時就通過該接口部來向文檔庫系統(tǒng)發(fā)出相應(yīng)指令,文檔庫系統(tǒng)根據(jù)該指令執(zhí)行相應(yīng)操作。這樣,只要各應(yīng)用軟件和各文檔庫系統(tǒng)都遵循同樣的標準,不同應(yīng)用軟件就可以通過同一個文檔庫系統(tǒng)對同一文檔操作,即可實現(xiàn)對文檔的互操作。同樣,同一個應(yīng)用軟件也可以通過不同文檔庫系統(tǒng)對不同文檔進行操作,而不用分別對每種文檔格式都進行單獨開發(fā)。
      本發(fā)明包括一個通用文檔安全模型,該通用文檔安全模型符合各應(yīng)用軟件對文檔安全的需求,使不同的應(yīng)用軟件都可以通過同一個接口部實現(xiàn)對文檔的安全控制。該通用文檔安全模型的具體內(nèi)容請參見后面的實施例說明。
      接口標準定義了基于該通用文檔模型和通用文檔安全模型對文檔進行操作的各種指令,以及應(yīng)用軟件向文檔庫系統(tǒng)發(fā)送指令的方式。文檔庫系統(tǒng)具備實現(xiàn)這些指令的功能,以供應(yīng)用軟件調(diào)用。
      該通用文檔模型還包括由多個文檔組成的文檔集、文檔庫和文檔倉庫等層次,接口標準中也包含對多文檔的組織管理、查詢檢索、安全控制等指令。
      該通用文檔模型還包括將頁由具有上下順序的層組成,接口標準中也包含對層的各種操作指令,以及對一個文檔某一層所對應(yīng)源文件的存儲和提取。
      文檔庫系統(tǒng)還具備對文檔的信息安全管理控制功能,如基于角色的細粒度權(quán)限管理,并在接口標準中定義了相關(guān)的操作指令。
      文檔庫系統(tǒng)由存儲器、文檔庫系統(tǒng)和應(yīng)用軟件組成。其中,文檔數(shù)據(jù)存儲在存儲器中,文檔庫系統(tǒng)有一個下接口部,應(yīng)用軟件有一個上接口部。當應(yīng)用軟件需要對文檔庫進行操作時,通過其上接口部向文檔庫系統(tǒng)的下接口部發(fā)出指令,文檔庫系統(tǒng)按照應(yīng)用軟件發(fā)出的指令,對存儲在存儲器中的文檔數(shù)據(jù)執(zhí)行相應(yīng)的操作。
      依照本發(fā)明,使得應(yīng)用層和數(shù)據(jù)處理層分離。這樣應(yīng)用軟件不再直接跟具體的文檔格式打交道,文檔也不再與特定應(yīng)用軟件綁定,從而使得同一文檔能在不同的應(yīng)用軟件之間通用,同一應(yīng)用軟件也能對不同文檔進行操作,實現(xiàn)了文檔的互操作;整個文檔處理系統(tǒng)還具備多文檔處理功能,而不局限在單文檔處理;將頁分成多層后,可以實現(xiàn)對不同層實施不同管理和控制,更便于不同應(yīng)用軟件對同一頁的操作(可以設(shè)計成不同應(yīng)用軟件管理和維護不同層),為以源文件方式進行編輯提供了便利,也是一種很好的保留歷史痕跡的方式;通過將信息安全集成在文檔處理的核心層,可以消滅安全縫隙,還能使安全機制與文檔操作緊密地結(jié)合為一體,而不是可以分離的兩個模塊,同時有更多的空間部署安全管理技術(shù),相關(guān)代碼也能隱藏得更深,能更有效地防御非法攻擊,提高安全可靠度,另外還能提供細粒度的安全管理手段,如更多的權(quán)限類別,更小的管理單元。
      本發(fā)明的有益效果是文檔數(shù)據(jù)安全管理系統(tǒng)集成了身份認證機制,可以對任意的邏輯數(shù)據(jù)指定訪問控制權(quán)限,也可以對任意邏輯數(shù)據(jù)進行加密,并且這種加密是與身份認證關(guān)聯(lián)的,其可以關(guān)聯(lián)到任意指定的一個或者多個角色,本發(fā)明系統(tǒng)還可以對任意的邏輯數(shù)據(jù)進行簽名,從而達到具有多重的安全特性文檔數(shù)據(jù)安全管理,保證文檔數(shù)據(jù)不被破壞。


      圖1為文檔處理系統(tǒng)的結(jié)構(gòu)框圖。
      圖2為通用文檔模型。
      圖3-9為通用文檔模型的詳細邏輯結(jié)構(gòu)。
      圖10為以UOML接口為例子的文檔處理系統(tǒng)。
      圖11為本發(fā)明文檔數(shù)據(jù)安全管理方法流程圖。
      具體實施例方式
      下面,參照附圖1~10描述文檔操作系統(tǒng)。
      如圖1所示,文檔處理系統(tǒng)主要由三個部分組成應(yīng)用軟件、文檔庫系統(tǒng)和存儲器。其中應(yīng)用軟件有一個上接口部,文檔庫系統(tǒng)有一個下接口部。
      存儲器常用的是硬盤或者內(nèi)存,也可以是光盤、閃存、軟盤、磁帶,甚至還可以是遠程的存儲設(shè)備,總之只要具備數(shù)據(jù)的存儲能力即可。在存儲器中存儲有多個文檔,但對應(yīng)用軟件而言并不需要關(guān)心文檔的具體存儲方式,只需要按照預(yù)定的通用文檔模型進行操作。圖2所示為一種通用文檔模型。
      各個軟件的功能千差萬別,對文檔的操作和記錄的數(shù)據(jù)也各自不同,例如Word和Excel處理的文檔就大相迥異。為了能夠定義出通用文檔模型,我們可以參考紙張的特性,這是因為以紙張作為文檔信息的記錄手段是通行至今的標準方法,只要能具備紙張的所有功能,就能滿足工作、生活等實際應(yīng)用的需求。
      根據(jù)這個思路,我們把文檔中的一頁當成一張紙,凡是能畫到紙上的就記錄下來,即該通用文檔模型能夠描述頁面上的所有可見內(nèi)容?,F(xiàn)有技術(shù)中的頁面描述語言(如PostScript)可以描述所有能印在紙上的信息,因此這一部分就不再詳細闡述。一般說來,頁面上的可見內(nèi)容最終都可以歸為文字、圖形、圖像三類。
      如果文檔中涉及到特定字體或特殊字符的話,為了保證在各臺電腦上都能有相同的效果,就需要在文檔中嵌入相應(yīng)字庫。為了提高存儲效率,字庫資源應(yīng)當共享,這樣即使在多處使用了同一字符,也只需要嵌入一個字庫。圖像有時也是可能在多處出現(xiàn)的,例如每一頁共同的底圖,或經(jīng)常出現(xiàn)的公司標識,這種情況下最好也能共享這些圖像。
      當然,作為更加先進的信息處理工具,不能僅僅模擬紙張的特性,還可以增加一些增強的數(shù)字特性,例如元數(shù)據(jù)、導航、導讀、微縮版面。元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),例如作者、出版社、出版時間、ISBN號等就是圖書的元數(shù)據(jù)。元數(shù)據(jù)是業(yè)內(nèi)通用名詞,也不在此贅述。導航是類似圖書目錄的信息,也是業(yè)內(nèi)通用名詞。導讀信息描述了一篇文章所在的區(qū)域和閱讀順序,這樣當閱讀者讀完一屏后就可以根據(jù)該信息自動判斷下一屏應(yīng)該顯示什么,這樣還能做到自動換欄、自動轉(zhuǎn)版,而不用閱讀者再手工指定位置。微縮版面是事先生成的各頁面的微縮圖,閱讀者可以通過查看微縮版面來指定閱讀哪一頁。
      通用文檔模型包含文檔倉庫、文檔庫、文檔集、文檔、頁、層、對象組、版面對象等多個層次。
      其中,文檔倉庫由一個或多個文檔庫組成,文檔庫之間的關(guān)系相對于文檔庫之下的層次之間的關(guān)系相對要松散一些,文檔庫之間可以非常簡單地組合和拆離,而不用對文檔庫本身的數(shù)據(jù)做改動,該多個文檔庫之間往往沒有建立統(tǒng)一索引(特別是全文索引),很多對文檔倉庫的檢索操作一般都需要遍歷各文檔庫的索引,而沒有統(tǒng)一的索引可用。每個文檔庫由一個或多個文檔集組成,每個文檔集由一個或多個文檔組成,還可以包含任意數(shù)量的子文檔集。這里所說的文檔相當于目前普通的一個文檔文件(例如DOC文檔),通用文檔模型可以規(guī)定一個文檔只能屬于一個文檔集,但允許一個文檔屬于多個文檔集也是一種不錯的選擇。文檔庫不是多個文檔的簡單組合,它把多個文檔緊密地組織起來,特別是為文檔內(nèi)容統(tǒng)一建立了各種檢索索引后就能帶來更大的便利性。
      每個文檔由一頁或存在一定順序(如前后順序)的多頁組成,每頁的版心可以不同,而且版心也不一定是矩形的,可以是任意形狀,可以用一條或多條封閉曲線表示版心。
      每頁又由一層或按一定順序(如上下順序)的多層組成,各層之間如同玻璃板的疊加關(guān)系。層由任意數(shù)量的版面對象和對象組組成,版面對象是指狀態(tài)(如字體、字號、顏色、ROP等)、文字(包括符號)、圖形(如直線、曲線、填充了指定顏色的閉合區(qū)域、漸變色等)、圖象(如TIF、JPEG、BMP、JBIG等)、語義信息(如標題開始、標題結(jié)束、換行等)、源文件、腳本、插件、嵌入式對象、書簽、鏈接、流媒體、二進制數(shù)據(jù)流等。一個或多個版面對象可以組成一個對象組。對象組也可以包含任意數(shù)量的子對象組。
      文檔庫、文檔集、文檔、頁、層都可以還包括元數(shù)據(jù)(如名稱、最后修改時間等,其類型可以根據(jù)應(yīng)用需求來設(shè)置)和/或歷史痕跡;文檔中還可以包括導航信息、導讀信息、微縮版面;也可以把微縮版面放在頁或者層這個層次;文檔庫、文檔集、文檔、頁、層、對象組都可以還包括數(shù)字簽名;語義信息最好跟著版面信息走,這樣可以避免數(shù)據(jù)冗余,也比較容易與版面建立對應(yīng)關(guān)系;文檔庫、文檔還可以包括字庫、圖像等共享對象。
      該通用文檔模型還可以定義一個或多個角色,為每個角色分配一定權(quán)限。權(quán)限以文檔庫、文檔集、文檔、頁、層、對象組、元數(shù)據(jù)為單元進行分配,定義每個角色對該單元是否可讀、是否可寫、是否可復(fù)制、是否可打印;該通用文檔模型是一個超越以往單個文檔對應(yīng)單個文件的方式,文檔庫中包含多個文檔集、文檔集中包含多個文檔,而對于文檔庫中文檔內(nèi)容,采用了細粒度的訪問和安全控制,我們可以具體訪問文檔庫中某個文字或者矩形,而不像現(xiàn)在的文檔管理系統(tǒng)只能訪問到文件名。
      圖3-9給出了一種通用文檔模型,通用文檔模型中所涉及的各對象以樹狀結(jié)構(gòu)組織,逐層展開、細化。
      文檔倉庫對象是由一個或多個文檔庫對象組成。
      如圖3所示,文檔庫對象是由一個或多個文檔集對象、任意數(shù)量文檔庫輔助對象和任意數(shù)量的文檔庫共享對象組成。
      其中,如圖4所示,文檔庫輔助對象是指元數(shù)據(jù)對象、角色對象、權(quán)限對象、插件對象、索引信息對象、腳本對象、數(shù)字簽名對象、歷史痕跡對象等,文檔庫共享對象是指文檔庫中的不同文檔可能共同使用的對象,如字庫對象、圖像對象等。
      其中,如圖5所示,每個文檔集對象由一個或多個文檔對象、任意數(shù)量的文檔集對象和任意數(shù)量的文檔集輔助對象組成。文檔集輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。當文檔集對象包括多個文檔集對象時,其類似于文件夾包括多個文件夾的形式。
      并且,如圖6所示,每個文檔對象由一個或多個頁面對象、任意數(shù)量的文檔輔助對象和任意數(shù)量的文檔共享對象組成。文檔輔助對象是指元數(shù)據(jù)對象、字庫對象、導航信息對象、導讀信息對象、微縮版面對象、數(shù)字簽名對象、歷史痕跡對象等,文檔共享對象是指文檔中的不同頁面可能共同使用的對象,如圖像對象、印章對象等。
      在圖7所示的頁面對象中,每個頁面對象由一個或多個層對象和任意數(shù)量的頁面輔助對象組成。頁面輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。
      每個層對象由一個或多個版面對象、任意數(shù)量的對象組和任意數(shù)量的層輔助對象組成(如圖8所示)。層輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。對象組由任意數(shù)量的版面對象、任意數(shù)量的對象組和可選的數(shù)字簽名對象組成。當對象組包括多個對象組時,其類似于文件夾包括多個文件夾的形式。
      進一步,如圖9所示,版面對象是指狀態(tài)對象、文字對象、直線對象、曲線對象、圓弧對象、路徑對象、漸變色對象、圖像對象、流媒體對象、元數(shù)據(jù)對象、批注對象、語義信息對象、源文件對象、腳本對象、插件對象、二進制數(shù)據(jù)流對象、書簽對象以及超鏈接對象。
      其中,狀態(tài)對象又是由任意數(shù)量的字符集對象、字體對象、字號對象、文字顏色對象,光柵操作對象、背景色對象、線顏色對象、填充色對象、線型對象、線寬對象、線接頭對象、畫刷對象、陰影對象、陰影顏色對象、旋轉(zhuǎn)對象、空心字對象、勾邊字對象、透明對象、渲染模式對象組成。
      在具體實施過程中,可以在上述通用文檔模型基礎(chǔ)上進一步增強或簡化。如果在簡化模型中省略了文檔集對象,則文檔庫對象直接由文檔對象組成;如果在簡化模型中省略了層對象,則頁面對象直接由版面對象組成。最簡化的通用文檔模型是只有文檔對象、頁面對象、版面對象,其中版面對象只有文字對象、直線對象、圖像對象、字體對象、字號對象。完整模型和最簡化模型之間的各種中間模型都屬于本實施例的變形。
      為了滿足各種應(yīng)用對文檔安全性的需求,我們還需要定義一種通用文檔安全模型。由于現(xiàn)有軟件的文檔安全功能不夠強,或者是安全管理機制與文檔處理模塊脫節(jié),因此不難定義一個涵蓋并超越現(xiàn)有應(yīng)用軟件的通用文檔安全模型1.在文檔庫中定義了若干角色,角色對象是文檔庫的子對象。如果對應(yīng)的通用文檔模型中沒有文檔庫對象,則角色是在文檔中定義的,即角色對象是文檔對象的子對象,此時本通用文檔安全模型中所說的文檔庫均用文檔替代。
      2.可以指定任意角色對任意對象(文檔庫、文檔集、文檔、頁、層、對象組、版面對象等)的訪問權(quán)限。如果指定了對某個對象的訪問權(quán)限,則該權(quán)限將適用于其所有子對象3.文檔庫系統(tǒng)實現(xiàn)的訪問權(quán)限包括是否可讀、是否可寫、是否可再授權(quán)(使其他角色擁有自己的部分或全部權(quán)限)、是否可收回授權(quán)(去掉其他角色的部分或全部授權(quán))及上述權(quán)限的排列組合,還可以定義更多權(quán)限(如不可打印)等。
      4.可以用某個角色的身份對各對象進行簽名。簽名范圍將包括該對象的子對象,以及引用到的對象
      5.文檔庫的初始創(chuàng)建者具有對該文檔庫的所有權(quán)限。
      6.任何應(yīng)用軟件都可以創(chuàng)建新角色。新角色的初始權(quán)限是對任何對象都沒有任何權(quán)限??梢杂镁哂性偈跈?quán)權(quán)限的角色對新角色授予一定的權(quán)限。
      7.創(chuàng)建角色對象的指令返回一個密鑰,作為今后登錄該角色的依據(jù),需要應(yīng)用軟件妥善保管。該密鑰通常是PKI的私鑰8.當應(yīng)用軟件以某一角色身份登錄時,采用“挑戰(zhàn)一應(yīng)答”機制,即文檔庫系統(tǒng)用保存的角色公鑰加密一塊數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后返回給文檔庫系統(tǒng),如果正確表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰(為保險起見該認證過程可能會重復(fù)幾次)。采用“挑戰(zhàn)-應(yīng)答”機制可以更好地保護私鑰的安全性9.可以創(chuàng)建一個特殊的缺省角色。當存在缺省角色時,任何應(yīng)用軟件一打開文檔庫就視為自動以缺省角色身份登錄。
      10.可以同時以多個角色身份登錄,此時擁有的權(quán)限是各角色權(quán)限的并集在具體實施過程中,可以在上述安全模型基礎(chǔ)上進一步增強、簡化或合并步驟,都屬于本實施例的變形。
      根據(jù)上述通用文檔模型、通用文檔安全模型和常用的文檔操作,可以定義相應(yīng)接口標準,用于發(fā)送對通用文檔模型中各對象進行操作的指令。特別地,如果在接口標準中定義了獲取版面位圖的指令,將對保障版面一致性和文檔互操作性起到非常關(guān)鍵的作用。
      通過獲取版面位圖的指令,應(yīng)用軟件可以直接獲取指定頁面的指定位圖格式的版面位圖(用位圖方式表示的該頁面的顯示效果),而不用自行解釋處理每一個版面對象。也就是說,應(yīng)用軟件可以直接獲得準確的版面位圖用于顯示/打印文檔,而不再需要自己挨個讀取頁面上每一層的每一個版面對象、自行解釋該對象的含義并在版面上體現(xiàn)出來。如果采用后一種方式的話,就又難免出現(xiàn)有的軟件解釋的比較全、比較準確,有的軟件解釋的不全或不準確,導致同一個文檔在不同軟件出現(xiàn)不同的顯示/打印效果,影響了文檔互操作的用戶體驗。通過由文檔庫系統(tǒng)統(tǒng)一生成版面位圖的方式,將保持版面一致性的關(guān)鍵點從應(yīng)用軟件移到了文檔庫系統(tǒng),從而為不同的應(yīng)用軟件打開同一文檔都能出現(xiàn)同樣的版面效果提供了可行之路。這一方面是因為文檔庫系統(tǒng)是統(tǒng)一的基礎(chǔ)技術(shù)平臺,由少數(shù)幾家專業(yè)的技術(shù)廠商開發(fā),肯定比各應(yīng)用軟件廠商實現(xiàn)得完整、準確,要求各文檔庫系統(tǒng)都能完整準確地解釋處理各版面對象是可行的,而同樣的要求對應(yīng)用軟件來說就不太可行了;另一方面是因為不同應(yīng)用軟件都可以與同一個文檔庫系統(tǒng)配套使用,這樣就更能確保顯示/打印效果的一致性了。簡單來說,就是要求應(yīng)用軟件之間保持一致不太可行,而要求文檔庫系統(tǒng)之間保持一致則是可行的,要求同一個文檔庫系統(tǒng)保持一致就更沒問題了。因此,為了保持同一文檔在不同應(yīng)用軟件之間的版面一致性,就需要把相關(guān)責任從應(yīng)用軟件轉(zhuǎn)移到文檔庫系統(tǒng),而由文檔庫系統(tǒng)來統(tǒng)一生成版面位圖是其中一個簡單易行的辦法。
      更進一步,獲取版面位圖的指令還可以指定頁面上的一個區(qū)域,可用于只顯示頁面的一個區(qū)域(例如當頁面比屏幕大時就不需要顯示整頁,滾動頁面時也只需要重畫滾動的區(qū)域);當該指令還允許指定獲取特定層組成的版面位圖,特別是可以指定由特定層以及該層下的所有層組成的版面位圖時,就可以很好地用于展現(xiàn)歷史痕跡,即可以看看在添加最近這一層以前是什么樣,再往前又是什么樣。如果需要的話,還可以具體指定哪一層參與位圖的生成,哪一層不參與。
      在檢索查詢指令中,除了常規(guī)的關(guān)鍵詞檢索外,還可以提供更加豐富的檢索手段。在常規(guī)的搜索技術(shù)中,搜索是和文檔處理分離的,搜索程序只能從文檔中提取純文本信息,而無法獲取更多信息,只能基于文本信息檢索。但在本發(fā)明中,檢索查詢功能是集成在文檔處理的核心層(即文檔庫系統(tǒng))的,這樣就可以更充分地利用文檔中蘊含的信息來提供更為強大的檢索手段,如1.基于字體信息的檢索,如檢索黑體字的“書生”,Times New Roman字體的“Sursen”2.基于字號信息的檢索,如檢索三號字的“書生”,20磅以上的“Sursen”,長字(即字高超過字寬)的“文檔庫”3.基于顏色的檢索,如檢索紅色的“書生”,藍色的“Sursen”4.基于版面位置的檢索,如檢索位于頁面上半部分的“書生”,位于頁腳的“Sursen”5.基于特殊修飾效果的檢索,如檢索斜體字的“書生”,順時針旋轉(zhuǎn)30度至90度之間的“Sursen”,空心字的“SEP”,勾邊字的“文檔庫”6.根據(jù)類似的思路,還可以進一步提供其它類型的檢索,如檢索反白(黑底白字)的“書生”,壓圖的“Sursen”等7.可以檢索多個版面對象的組合,如“書生”距離“Sursen”不超過5厘米8.上述檢索條件的任意組合現(xiàn)在介紹接口標準的實現(xiàn)方式。接口標準可以是上接口部按照預(yù)先定義的標準格式生成命令串(如“&lt;UOML_INSERT(OBJ=PAGE,PARENT=123.456.789,POS=3)/&gt;”),將該命令串發(fā)送給下接口部,并從下接口部接收執(zhí)行結(jié)果或其它反饋信息;或者是下接口部提供一些具有標準名稱和參數(shù)的接口函數(shù)(如“BOOL UOI_InsertPage(UOI_Doc*pDoc,int nPage)”),上接口部直接調(diào)用這些標準函數(shù);或者是上述方法的組合。
      接口標準還可以用“動作+對象”的方式來定義,這樣便于學習和理解,也便于保持接口標準的穩(wěn)定性。例如,對20種不同對象進行10種操作,可以定義20×10=200種指令,也可以定義20種對象和10種動作,但顯然后一種方式大大減輕了記憶的負擔,而且今后在對接口標準進行擴充時,增加一個對象或動作也很簡單。
      例如,我們定義以下7種動作打開用于創(chuàng)建或打開文檔庫;關(guān)閉用于關(guān)閉會話句柄、關(guān)閉文檔庫;獲取用于獲取對象列表、對象相關(guān)屬性和數(shù)據(jù);設(shè)置用于設(shè)置/修改對象數(shù)據(jù);插入插入指定對象或數(shù)據(jù);刪除用于刪除對象的某個子對象;檢索查詢用于根據(jù)定義條件在文檔中找到符合條件的內(nèi)容,這些條件既可以是準確的信息,也可以是不準確的信息(模糊查找)我們再定義如下對象文檔庫、文檔集、文檔、頁、層、對象組、文字、圖像、圖形、路徑(由一組順序圖形連接組成,可以是閉合也可以不閉合的)、源文件、腳本、插件、音頻、視頻、角色等。
      對象還包括下列狀態(tài)對象背景色、線的顏色、填充色、線型、線寬、ROP、畫刷、陰影、陰影顏色、字符高、字符寬、旋轉(zhuǎn)、透明、渲染模式等。
      在采用“動作+對象”方式時,不能自動理解為每一個對象和每一個動作的所有組合都一定能構(gòu)成有實際意義的操作指令,在很多實施例中會存在一些組合是沒有意義的,就象不是所有動詞和所有名詞都能組成以意義的詞組一樣。
      以下是用“動作+對象”的格式定義命令的一種實施例,該實施例被稱為UOML,是用XML描述的一系列的命令。上接口部生成符合UOML格式的字符串,并將該字符串發(fā)送給下接口部,就將相應(yīng)的操作指令發(fā)送給了文檔庫系統(tǒng)。文檔庫系統(tǒng)執(zhí)行這些命令后,下接口部將執(zhí)行結(jié)果也生成一個符合UOML格式的字符串,返回給上接口部,使應(yīng)用軟件能夠知曉操作執(zhí)行結(jié)果。
      所有執(zhí)行結(jié)果都由UOML_RET表示,其定義如下屬性SUCCESS為true時表明操作成功,為false表明操作失敗子元素ERR_INFO可選,僅當操作失敗時出現(xiàn),描述了相應(yīng)的錯誤信息。
      其它子元素根據(jù)具體動作確定,可參考以下各動作說明。
      UOML動作包括1 UOML_OPEN創(chuàng)建或打開文檔庫1.1屬性1.1.1 create為true時是創(chuàng)建,否則是打開已有文檔庫1.2子元素1.2.1 path文檔庫路徑??梢允谴疟P文件名,也可以是URL,或者是內(nèi)存指針,或者是網(wǎng)絡(luò)路徑,或者是文檔庫的邏輯名稱,或者其它能夠指定文檔庫的表示方法??梢杂貌煌卣鞯淖址畢^(qū)分上述各種情況,即不用改變命令格式,只要給字符串設(shè)置不同特征,就可以用不同的方法指定文檔庫。例如,磁盤文件名采用設(shè)備名稱(如盤符)和“:”開頭(如“C:”、“D:”),而且緊跟著“:”不會是“//”,也不會是又一個“:”;URL采用協(xié)議名稱和“://”開頭(如“http://”);內(nèi)存指針用“MEM::”開頭,后面是指針的字符串表示方式,例如“MEM::1234:5678”;網(wǎng)絡(luò)路徑是“\\”開頭,后面是服務(wù)器名,以及服務(wù)器上的路徑,如“\\server\abc\def.sep”;文檔庫的邏輯名稱可以用“*”開頭,如“*MyDocBasel”。在下接口解析時,如果第一個字母是“*”就表明該字符串代表文檔庫的邏輯名稱;否則如果頭兩個字母是“\\”就表明該字符串代表網(wǎng)絡(luò)路徑;否則如果頭五個字母是“MEM::”就表明該字符串代表內(nèi)存指針;否則尋找字符串的第一個“:”,如果該“:”后面是“//”該就表明字符串代表URL,否則就代表本地設(shè)備上的文件。對于打開服務(wù)器上的文檔庫的情形,可以設(shè)立一個專門的URL協(xié)議來區(qū)分,例如用“Docbase://myserver/mydoc2”指明打開服務(wù)器myserver上運行的文檔庫系統(tǒng)服務(wù)器系統(tǒng)所管理的mydoc2文檔庫。
      總之,只要能給字符串設(shè)置不同特征,就可以用不同的方式來指定文檔庫。根據(jù)上述說明,我們還可以定義各種不同的字符串特征;該方式不僅能應(yīng)用于指定文檔庫路徑,還能應(yīng)用于其它場合,特別是用來指定特定資源位置的應(yīng)用場合。在很多情況下,我們希望能夠用一種新方式來指定相關(guān)資源,但又不能或不希望改變現(xiàn)有的協(xié)議或函數(shù),這時就可以通過在字符串中設(shè)置不同特征的方式來指定,因為這種方法具有最好的通用性(任何協(xié)議或函數(shù),只要支持磁盤文件名或URL,就支持字符串)。
      1.3 返回值如果成功,則在UOML_RET中包含一個“handle”子元素,記錄句柄2關(guān)閉(UOML_CLOSE)2.1 屬性無2.2 子元素2.2.1 handle對象句柄,是一個字符串表示的對象的引用指針2.2.2 db_handle文檔庫句柄,字符串表示的文檔庫的引用指針2.3 返回值無返回值
      3 UOML_GET獲取3.1 屬性3.1.1 usage用途,為”GetHandle”(獲取指定對象句柄)、”GetObj”(獲取指定對象數(shù)據(jù))、”GetPageBmp”(獲取版面位圖)中的一個3.2 子元素3.2.1 parent父對象句柄,usage屬性為”GetHandle”時使用3.2.2 pos位置順序號,usage屬性為”GetHandle”時使用3.2.3 handle指定對象的句柄,當usage屬性為”GetObj”時使用3.2.4 page需要顯示的頁面的句柄,當usage屬性為”GetPageBmp”時使用3.2.5 input描述了對輸入頁面的約束,其中可以指定顯示一層或者多層的內(nèi)容(可以顯示的層一定是當前角色有權(quán)限訪問的層);也可以通過指定Clip區(qū)域來指定顯示區(qū)域的大小。當usage屬性為”GetPageBmp”時使用3.2.6 output描述了版面位圖的輸出方式,當usage屬性為”GetPageBmp”時使用3.3 返回值3.3.1 當usage屬性為”GetHandle”時,執(zhí)行成功時在UOML_RET中包含一個“handle”子元素,記錄parent下第pos個子對象的句柄3.3.2 當usage屬性為”GetObj”時,執(zhí)行成功時在UOML_RET中包含一個“xobj”子元素,含有handle對象的數(shù)據(jù)的xml表示3.3.3 當usage屬性為”GetPageBmp”時,執(zhí)行成功時在output指定位置輸出版面位圖4 UOML_SET設(shè)置4.1 屬性無4.2 子元素4.2.1 Handle設(shè)置對象的句柄4.2.2 xobj對象的描述4.3 返回值無返回值
      5 UOML_INSERT插入5.1 屬性無5.2 子元素5.2.1 parent父對象句柄5.2.2 xobj對象的描述5.2.3 pos插入位置5.3 返回值如果執(zhí)行成功,則將xobj參數(shù)表示的對象,插入到parent中成為其第pos個子對象,并在UOML_RET中包含一個”handle”子元素,表示新插入對象的句柄6 UOML_DELETE 刪除6.1 屬性無6.2 子元素6.2.1 handle需要刪除的對象的句柄。
      6.3 返回值無返回值7 UOML_QUERY檢索查詢7.1 屬性無7.2 子元素7.2.1 handle需要查詢的文檔庫句柄7.2.2 condition查詢條件7.3 返回值如果成功,在UOML_RET中包含一個“handle”子元素代表查詢結(jié)果的句柄,一個“number”子元素代表查詢結(jié)果的數(shù)量,可以用UOML_GET來獲取每一個查詢結(jié)果UOML對象包括文檔庫(UOML_DOCBASE)、文檔集(UOML_DOCSET)、文檔(UOML_DOC)、頁(UOML_PAGE)、層(UOML_LAYER)、對象組(UOML_OBJGROUP)、文字(UOML_TEXT)、圖像(UOML_IMAGE)、直線(UOML_LINE)、曲線(UOML_BEIZER)、圓弧(UOML_ARC)、路徑(UOML_PATH)、源文件(UOML_SRCFILE)、背景色(UOML_BACKCOLOR)、前景顏色(UOML_COLOR)、ROP(UOML_ROP)、字符尺寸(UOML_CHARSIZE)、字體(UOML_TYPEFACE)、角色(UOML_ROLE)、權(quán)限(UOML_PRIV)等。
      以下我們以部分對象為例說明其定義方式1 UOML_DOC1.1 屬性無1.2 子元素1.2.1 metadata元數(shù)據(jù)1.2.2 pageset各頁面1.2.3 fontinfo嵌入字庫1.2.4 navigation導航信息1.2.5 thread導讀信息1.2.6 minipage微縮版面1.2.7 signiture數(shù)字簽名1.2.8 log歷史痕跡1.2.9 shareobj文檔共享對象2 UOML_PAGE2.1 屬性2.1.1 resolution邏輯分辨率2.1.2 size版心大小,用寬高表示2.1.3 rotaion旋轉(zhuǎn)角度2.1.4 log歷史痕跡2.2 子元素
      2.2.1 GS初始圖形狀態(tài),包括charstyle(字符風格)、linestyle(線型)、linecap(線頭類型)、linejoint(接頭類型)、linewidth(線寬)、fillrule(填充規(guī)測)、charspace(字間距)、linespace(行間距)、charroate(字符旋轉(zhuǎn)角度)、charslant(字符傾斜方向)、charweight(字色重)、chardirect(字符方向)、textdirect(文本方向)、shadowwidth(陰影寬度)、shadowdirect(陰影方向)、shadowboderwidth(陰影邊線寬度)、outlinewidth(輪廓寬度)、outlineboderwidth(輪廓邊線寬度)、linecolor(線的顏色)、fillcolor(填充色)、backcolor(背景色)、textcolor(文字顏色)、shadowcolor(陰影顏色)、outlinecolor(輪廓線顏色)、matrix(變換矩陣)、cliparea(裁減區(qū))2.2.2 metadata元數(shù)據(jù)2.2.3 layerset屬于該頁的各層2.2.4 signiture數(shù)字簽名2.2.5 log歷史痕跡3 UOML_TEXT3.1 屬性3.1.1 Encoding文字編碼方式3.2 子元素3.2.1 TextData文字內(nèi)容3.2.2 CharSpacingList對非等間距文字的字間距列表3.2.3 StartPos起點位置
      4 UOML_CHARSIZE4.1 屬性4.1.1 width字符寬度4.1.2 height字符高度4.2 子元素無5 UOML_LINE5.1 屬性5.1.1 LineStyle線型5.1.2 LineCap線的接頭類型5.2 子元素5.2.1 StartPoint線的起點坐標5.2.2 EndPoint線的終點坐標6 UOML_BEIZER6.1 屬性6.1.1 LineStyle線型6.2 子元素6.2.1 StartPoint貝塞爾曲線的起點坐標6.2.2 Control1_Point貝塞爾曲線的第一控制點6.2.3 Control2_Point貝塞爾曲線的第二控制點6.2.4 EndPoint貝塞爾曲線的終點坐標7 UOML_ARC
      7.1 屬性7.1.1 ClockWise弧的方向7.2 子元素7.2.1 StartPoint弧的起點坐標7.2.2 EndPoint弧線的終點坐標7.2.3 Center弧的圓心坐標8 UOML_COLOR8.1 屬性8.1.1 Type顏色類型,RGB或CMYK8.2 子元素RGB模式8.2.1 Red紅色8.2.2 Green綠色8.2.3 Blue藍色8.2.4 Alpha透明度CMYK模式8.2.5 Cyan青色8.2.6 Magenta品紅8.2.7 Yellow黃色
      8.2.8 Black_ink黑色9以此類推,我們可以用同樣的方法來描述所有的UOML對象。當應(yīng)用軟件對文檔庫進行操作時,由上述UOML動作與UOML對象依照XML語法生成相應(yīng)的UOML命令,將該UOML命令發(fā)給文檔庫系統(tǒng)即代表向文檔庫系統(tǒng)發(fā)出了相應(yīng)操作指令。
      例如,對創(chuàng)建文檔庫操作,可以用以下命令來完成&lt;UOML_OPEN create=″true″&gt;
      &lt;path val=″f:\\data\\docbasel.sep″/&gt;
      &lt;/UOML_OPEN&gt;
      對創(chuàng)建文檔集操作,可以用以下命令來完成&lt;UOML_INSERT&gt;
      &lt;parent val=″123.456.789″/&gt;
      &lt;pos val=″1″/&gt;
      &lt;xobj&gt;
      &lt;docset/&gt;
      &lt;/xobj&gt;
      &lt;/UOML_INSERT&gt;
      需要說明的是,雖然UOML是用XML定義的,但為了顯得更加簡潔,我們在前面省略了類似“&lt;?xml version=″1.0″encoding=″UTF-8″?&gt;”以及“xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″”之類的常規(guī)XML格式,只要是熟悉XML語法的實施者都可以自行補充完整。
      我們也可以不用XML方式定義命令串,例如改用類似PostScript那樣的方式,這樣上例變成這樣的1,″f:\\data\\docbasel.sep″,/Open/docset,1,“123.456.789”,/Insert根據(jù)同樣的思路,我們還可以定義出其它類型的命令串格式,甚至我們還可以不用文本方式,而用二進制方式來定義命令串。
      除了“動作+對象”方式外,我們也可以用其它方式定義命令串。例如,對每一個對象的每一個操作都用一個命令來表示,即用“UOML_INSERT_DOCSET”來表示插入一個文檔集,用“UOML_INSERT_PAGE”來表示插入一頁,我們以這樣的方式來定義每個命令UOML_INSERT_DOCSET在文檔庫中創(chuàng)建一個文檔集屬性無子元素parent文檔庫句柄pos插入位置返回值如果執(zhí)行成功,則在UOML_RET中包含一個”handle”子元素,表示新插入文檔集的句柄這樣上例就變?yōu)?amp;lt;UOML_INSERT_DOCSET&gt;
      &lt;parent val=″123.456.789″/&gt;
      &lt;pos val=″1″/&gt;
      &lt;/UOML_INSERT_DOCSET&gt;
      用這種方法定義命令格式的話就需要對每個對象的每種合法操作都單獨定義一條命令,會比較繁瑣。
      接口標準也可以用函數(shù)調(diào)用的方式來實施,即通過上接口調(diào)用下接口的接口函數(shù)的方式來發(fā)送操作指令給文檔庫系統(tǒng)的以下以C++語言為例說明,該實施例稱為UOI。
      我們先定義一個UOI返回值結(jié)構(gòu)struct UOI_Ret{BOOL m_bSuccess; //操作是否成功CString m_ErrInfo; //如果操作不成功,錯誤信息是什么};定義所有UOI對象的基礎(chǔ)類class UOI_Object{
      publicenum Type{TYPE_DOCBASE,TYPE_DOCSET,TYPE_DOC,TYPE_PAGE,TYPE_LAYER,TYPE_TEXT,TYPE_CHARSIZE,……對通用文檔模型中定義的其它對象的類型的定義與上面類似,以下省略。
      };Type m_Type;UOI_Object();virtual~UOI_Object();static UOI_Object*Create(Type objType);//根據(jù)指定類型創(chuàng)建相應(yīng)對象};然后定義如下幾個UOI函數(shù),與第一個實施例中的幾個UOML動作相對應(yīng)打開或創(chuàng)建文檔庫,成功則將其句柄返回在pHandle中UOI_RET UOI_Open(char*path,BOOL bCreate,HANDLE*pHandle);關(guān)閉db_handle文檔庫中的handle句柄,如果handle為NULL則關(guān)閉整個文檔庫UOI_RET UOI_Close(HANDLE handle,HANDLE db_handle);獲取指定子對象句柄UOI_RET UOI_GetHandle(HANDLE hParent,int nPos,HANDLE*pHandle);獲取句柄所指向的對象的類型UOI_RET UOI_GetObjType(HANDLE handle,UOI_Object::Type*pType);獲取句柄所指向的對象數(shù)據(jù)
      UOI_RET UOI_GetObj(HANDLE handle,UOI_Object*pObj);獲取版面位圖UOI_RET UOI_GetPageBmp(HANDLE hPage,RECT rect,void*pBuf);設(shè)置對象UOI_RET UOI_SetObj(HANDLE handle,UOI_Object*pObj);插入對象UOI_RET UOI_Insert(HANDLE hParent,int nPos,UOI_Object*pObj,HANDLE*pHandle=NULL);刪除對象UOI_RET UOI_Delete(HANDLE handle);檢索查詢,檢索結(jié)果的數(shù)量返回在pResultCount中,檢索結(jié)果列表的句柄返回在phResult中UOI_RET UOI_Query(HANDLE hDocbase,const char*strCondition,HANDLE*phResult,int*pResultCount);然后定義各UOI對象,依然以UOI_Doc、UOI_Text和UOML_CharSize為例說明class UOI_Doc:public UOI_Object{publicUOI_MetaData m_MetaData;int m_nPages;UOI_Page**m_pPages;int m_nFonts;UOI_Font**m_pFonts;UOI_Navigationm_Navigation;UOI_Threadm_Thread;UOI_MiniPage*m_pMiniPages;UOI_Signature m_Signature;int m_nShared;UOI_Obj*m_pShared;
      UOI_Doc();virtual~UOI_Doc();};class UOI_Text:public UOI_Object{public:
      enum Encoding{ENCODE_ASCII,ENCODE_ GB13000,ENCODE_UNICODE,......
      };Encoding m_Encoding;char*m_pText;Pointm_Start;int*m_CharSpace;UOI_Text();virtual~UOI_Text();};class UOI_CharSize:public UOI_Object{publicint m_Width;int m_Height;UOI_CharSize();virtual~UOI_CharSize();};
      以下示例說明UOI的使用方法。首先是創(chuàng)建文檔庫操作ret=UOI_Open(″f:\\data\\docbasel.sep″,TRUE,&amp;hDocBase);然后是構(gòu)建一個創(chuàng)建新對象的函數(shù)HANDLE InsertNewObj(HANDLE hParent,int nPos,UOI_Object::Type type){UOI_Retret;HADNLE handle;UOI_Obj*pNewObj=UOI_Obj::Create(type);if(pNewObj=NULL)return NULL;ret=UOI_Insert(hParent,nPos,pNewObj,&amp;handle);delete pNewObj;return ret.m bSuccess?handle:NULL;}然后是直接獲取對象的函數(shù)UOI_Obj*GetObj(HANDLE handle){UOI_Retret;UOI_Object::Type type;UOI_Obj*pObj;ret=UOI_GetObjType(handle,&amp;type);if(!ret.m_bSuccess)return NULL;pObj=UOI_Obj::Create(type);if(pObj=NULL)return NULL;ret=UOI_GetObj(handle,pObj);if(!ret.m_bSuccess){delete pObj;
      return NULL;}return pObj;}我們還可以用非“動作+對象”的函數(shù)方式來定義接口標準,例如對每一個對象的每一種操作都定義一個接口函數(shù),這樣插入文檔集的操作指令就是上接口以下列方式調(diào)用下接口的接口函數(shù)來發(fā)送給文檔庫系統(tǒng)的UOI_InsertDocset(pDocbase,0);我們還可以封裝各個對象類(如文檔庫類),把該對象可以進行的操作定義成該類的方法,如class UOI_DocBase:public UOI_Obj{public/*!*\brief創(chuàng)建文檔庫*\param szPath 文檔庫全路徑*\param bOverride是否覆蓋原文件*\return UOI DocBase對象*/BOOL Create(const char*szPath,bool bOverride=false);/*!*\brief打開文檔庫*\param szPath文檔庫全路徑*\return UOI DocBase對象*/BOOL Open(const char*szPath);/*!*\brief關(guān)閉文檔庫
      *\param 無*\return 無*/void Close();/*!*\brief獲取角色列表*\param 無*\returnUOI_RoleList對象*\sa UOI_RoleList*/UOI_RoleList GetRoleList();/*!*\brief存儲文檔庫*\param szPath存儲文檔庫全路徑*\return無*/void Save(char*szPath=0);/*!*\brief插入文檔集*\param nPos插入文檔集的位置*\returnUOI_DocSet對象*\sa UOI_DocSet*/UOI_DocSet InsertDocSet(int nPos);/*!*\brief獲取指定索引的文檔集*\param nIndex文檔列表的索引號*\returnUOI DocSet對象
      *\saUOI_DocSet*/UOI_DocSet GetDocSet(int nIndex);/*!*\brief獲取文檔集的總數(shù)*\param 無*\return文檔集個數(shù)*/int GetDocSetCount();/*!*\brief 設(shè)置文檔庫的名稱*\param nLen文檔庫名稱長度*\param szName文檔庫名稱*\return無*/void SetName(int nLen,const char*szName);/*!*\brief獲取文檔庫名稱長度*\param 無*\return 長度*/int GetNameLen();/*!*\brief獲取文檔庫名稱*\param 無*\return文檔庫名稱*/const char*GetName();/*!
      *\brief獲取文檔庫id長度*\param 無*\return長度*/int GetIDLen();/*!*\brief獲取文檔庫id*\param 無*\returnid*/const char*GetID();//!構(gòu)造函數(shù)UOI_DocBase();//!析構(gòu)函數(shù)virtual~UOI_DocBase();};class UOI_Text:public UOI Obj{public//!構(gòu)造函數(shù)UOI_Text();//!析構(gòu)函數(shù)virtual~UOI_Text();
      //!表示文本編碼的枚舉類型enum UOI_TextEncoding{CHARSET_GB2312, /*!&lt;GB2312,alal-fefe*/CHARSET_HZ2312, /*!&lt;GB2312 except GBFH,bOal-fefe*/CHARSET_GB12345,/*!&lt;GB12345,traditional char ofGB2312,alal-fefe*/CHARSET_HZ12345,/*!&lt;GB12345 except GBFH,traditiornal char of HZ2312,bOal-fefe*/CHARSET GB13000,/*!&lt;GBK,8141-fefe*/CHARSET_HZ13000,/*!&lt;GBK except GBFH,8141-fefe except alal-affe*/CHARSET_GB18030,/*!&lt;GB18030 except GBFH,unsupported in this version*/CHARSET_HZ18030,/*!&lt;GB18030 except GBFH,unsupported in this version*/CHARSET_UNICODE,/*!&lt;UniCode,unsupported in this version*/CHARSET_ASCII, /*!&lt;ASCII編碼*/};//!獲得文本的編碼UOI_TextEncoding GetEncoding();//!設(shè)置文本的編碼void SetEncoding(UOI_TextEncoding nEncoding);
      //!獲得文本的數(shù)據(jù)const char*GetTextData();//!獲得文本的數(shù)據(jù)長度int GetTextDataLen();//!設(shè)置文本的數(shù)據(jù)/*!\param pData文本數(shù)據(jù)\param nLen數(shù)據(jù)長度*/void SetTextData(const char*pData,int nLen);//!獲得起點位置Point GetStartPoint();//!設(shè)置起點位置void SetStartPoint(Point startPoint);//!獲得字符間距表大小int GetCharSpacingCount();//!獲得字符間距表中指定位置的字符間距float GetCharSpacing(int nIndex);//!設(shè)置字符間距表大小bool SetCharSpacingCount(int nLen);
      //!設(shè)置字符間距bool SetCharSpacing(int nIndex,float charSpace);//!獲得文本的外框UOI_Rect GetExtentArea();};class UOI_Arc:public UOI_Obj { //圓弧對象及其操作public//!構(gòu)造函數(shù)UOI Arc();//!析構(gòu)函數(shù)virtual~UOI_Arc();//!獲得圓弧起點/*!\return圓弧起點*/UOI_Point GetStartPoint();//!獲得圓弧終點/*!\return圓弧終點
      */UOI_Point GetEndPoint();//!獲得圓弧旋轉(zhuǎn)角/*!\return橢圓橫軸與坐標系X軸的夾角,單位為弧度*/float GetRotAng();//!設(shè)置圓弧旋轉(zhuǎn)角/*!\param fRotAng新的旋轉(zhuǎn)角\sa GetRotAng()*/void SetRotAng(float fRotAng);//!獲得X半軸長度float GetRadiusX();//!設(shè)置X半軸長度void SetRadiusX(float fRx);//!獲得Y半軸長度float GetRadiusY();
      //!設(shè)置Y半軸長度void SetRadius Y(float fRy);//!獲得弧線方向(是否為順時針)bool GetClock Wise();//!設(shè)置弧線方向(是否為順時針)void SetClockWise(bool bClockWise);//!獲得(由圓弧起點-&gt;圓心-&gt;圓弧終點,是否為順時針方向)bool GetGreatArcFlag();//!設(shè)置(由圓弧起點-&gt;圓心-&gt;圓弧終點,是否為順時針方向)void SetGreatArcFlag(bool bGreat);//!計算圓心,由參數(shù)返回,如果數(shù)據(jù)無效,則返回false,否則返回truebool GetCenter(float &amp;fCx,float &amp;fCy);};class UOI_RoleList:public UOI_Obj{public//!獲得列表中角色的數(shù)目int GetRoleCount();
      //!按指定索引獲得角色UOI_Role*GetRole(int nIndex);//!創(chuàng)建角色/*!\param pPrivKey私鑰緩沖區(qū)\param pnKeyLen用于返回實際私鑰的長度\return新創(chuàng)建的角色*/UOI_Role AddRole(unsigned char*pPrivKey,int*pnKeyLen);//!構(gòu)造函數(shù)UOI_RoleList();//!析構(gòu)函數(shù)virtual~UOI_RoleList();};class UOI_Role:public UOI_Obj{public//!構(gòu)造函數(shù)UOI_Role();
      //!析構(gòu)函數(shù)virtual~UOI_Role();//!獲得角色IDint GetRoleID();//!設(shè)置角色ID/*!\param nID角色ID*/void SetRoleID(int nID);//!獲得角色名稱const char*GetRoleName();//!設(shè)置角色名稱/*!\param szName角色名稱*/void SetRoleName(const char*szName);};
      class UOI_PrivList:public UOI_Obj//權(quán)限列表{public//!獲得指定角色對應(yīng)的權(quán)限UOI_RolePriv*GetRolePriv(UOI_Role*pRole);//!新建某角色的權(quán)限項UOI_RolePriv*pPriv AddRole();//!獲得列表中角色權(quán)限項的數(shù)目int GetRolePrivCount();//!按索引值,獲得角色權(quán)限項UOI_RolePriv*GetRolePriv(int nIndex);//!構(gòu)造函數(shù)UOI_PrivList();//!析構(gòu)函數(shù)virtual~UOI_PrivList();};class UOI_RolePriv:public UOI_Obj//對應(yīng)于某一個角色的所有權(quán)限{public:
      //!獲得角色UOI_Role*GetRole();//!設(shè)置對某個對象的權(quán)限,當權(quán)限超過該角色對該對象的當前權(quán)限時為授權(quán),小于時為收回授權(quán)。當前登錄的角色必須有相應(yīng)的再授權(quán)或收回授權(quán)權(quán)限bool SetPriv(UOI_Obj*pObj,UOI_Priv*pPriv);//!獲得權(quán)限設(shè)置數(shù)量int GetPrivCount();//!獲得索引值對應(yīng)的權(quán)限設(shè)置的對象UOI_Obj*GetObj(int nIndex);//!獲得索引值對應(yīng)的權(quán)限設(shè)置的權(quán)限UOI_Priv*GetPriv(int nIndex);//!獲得對應(yīng)于某一個對象的的權(quán)限UOI_Priv*GetPriv(UOI_Obj*pObj);//!構(gòu)造函數(shù)UOI_RolePriv();//!析構(gòu)函數(shù)virtual~UOI_RolePriv();};class UOI_Priv:public UOI_Obj
      {public:
      enum PrivType{//各權(quán)限類型定義PRIV_READ,//讀權(quán)限PRIV_WRITE,//寫權(quán)限PRIV_RELICENSE, //再授權(quán)權(quán)限PRIV_BEREAVE,//收回授權(quán)權(quán)限PRIV_PRINT,//打印權(quán)限其它權(quán)限定義}//!是否有相應(yīng)權(quán)限bool GetPriv(PrivType privType);//!設(shè)置相應(yīng)權(quán)限void SetPriv(PrivType priv Type,bool bPriv);//!構(gòu)造函數(shù)UOI_Priv();//!析構(gòu)函數(shù)virtual~UOI_Priv();};
      class UOI_SignList:public UOI_Obj{public:
      //!構(gòu)造函數(shù)UOI_SignList();//!析構(gòu)函數(shù)virtual~UOI_SignList();//!添加新的結(jié)點簽名,返回其索引值int AddSign(UOI_Sign*pSign);//!按指定索引值,獲得結(jié)點簽名UOI_Sign GetSign(int index);//!按指定索引值,刪除結(jié)點簽名void DelSign(int index);//!獲得列表中結(jié)點簽名的數(shù)目int GetSignCount();};class UOI_Sign:public UOI_Obj{
      public:
      //!構(gòu)造函數(shù)UOI_Sign();//!析構(gòu)函數(shù)virtual~UOI_Sign();//!執(zhí)行簽名/*!\param pDepList簽名所依賴的列表\param pRole用于簽名的角色\param pObj被簽名的對象*/void Sign(UOI_SignDepList pDepList,UOI_Role pRole,UOI_Obj pObj);//!驗證簽名bool Verify();//!獲得簽名的依賴列表UOI_SignDepList GetDepList();};class UOI_SignDepList:public UOI_Obj
      {public:
      //!構(gòu)造函數(shù)UOI_SignDepList();//!析構(gòu)函數(shù)virtual~UOI_SignDepList();//!加入一個依賴項void InsertSignDep(UOI_Sign*pSign);//!獲得依賴項的數(shù)目int GetDepSignCount();//!按指定索引值,獲得依賴項UOI_Sign*GetDepSign(int nIndex);};這樣插入文檔集的操作指令就是上接口以下列方式調(diào)用下接口的接口函數(shù)來發(fā)送給文檔庫系統(tǒng)的pDocBase.InsertDocset(0);我們還可以用同樣的方法為Java、C#、VB、Delphi等各種編程語言開發(fā)的應(yīng)用軟件設(shè)計各種不同的接口標準。
      只要在接口標準中不含有與特定的操作系統(tǒng)(如WINDOWS、UNIX/LINUX、MAC OS、SYMBIAN)或特定的硬件平臺(如x86CPU、MIPS、POWER PC等)相關(guān)連的特征,該接口標準就可以具有跨平臺性,使得不同平臺上運行的應(yīng)用軟件和文檔庫系統(tǒng)都可以統(tǒng)一使用同樣的接口標準,特別是可以讓一個平臺上運行的應(yīng)用軟件可以調(diào)用另一個平臺上運行的文檔庫系統(tǒng)來執(zhí)行相應(yīng)操作。例如,應(yīng)用軟件部署在客戶端,使用的是PC機,Windows操作系統(tǒng),文檔庫系統(tǒng)部署在服務(wù)器端,使用的是大型機,Linux操作系統(tǒng),但應(yīng)用軟件依然可以像調(diào)用本地文檔庫系統(tǒng)一樣調(diào)用服務(wù)器上的文檔庫系統(tǒng)來執(zhí)行相應(yīng)文檔操作。
      如果在接口標準中不含有與特定編程語言相關(guān)的特征,則該接口標準還能做到與編程語言無關(guān)??梢钥闯?,用命令串的方式容易構(gòu)造與平臺無關(guān)、與編程語言無關(guān)的接口標準,更具有通用性。特別是用XML來構(gòu)造命令串的話,由于目前在各種不同平臺、不同編程語言都存在易于獲得的XML生成解析工具,因此不僅該接口標準具有很好的跨平臺性和與編程語言無關(guān)性,也非常便于工程師開發(fā)上接口部和下接口部。
      以上列舉了多種接口標準的實施方法,按照類似的思路,不難設(shè)計出更多種類的接口標準。
      接口標準可以在上述實施例的基礎(chǔ)上按同樣的思路增加操作指令,也可以簡化操作指令,特別是通用文檔模型被簡化時操作指令也會相應(yīng)被簡化。最簡化情況下只有文檔的創(chuàng)建、頁面的創(chuàng)建、各版面對象的創(chuàng)建這幾個操作指令。
      現(xiàn)在,返回圖1,繼續(xù)描述依照本發(fā)明的文檔操作系統(tǒng)的工作過程。
      應(yīng)用軟件可以是具有符合接口標準的上接口部的任意軟件,例如Office軟件、內(nèi)容管理、資源采集等。任一應(yīng)用軟件在需要對文檔進行操作時,依照前述方法將指令傳遞給文檔庫系統(tǒng),文檔庫系統(tǒng)根據(jù)指令來完成具體操作過程。
      文檔庫系統(tǒng)可以自由地存儲、組織文檔庫數(shù)據(jù),例如可以把一個文檔庫的文件全部都存儲在一個磁盤文件中;可以一個文檔對應(yīng)一個磁盤文件,利用操作系統(tǒng)中的文件系統(tǒng)功能實現(xiàn)多文檔組織;也可以一頁對應(yīng)一個磁盤文件;還可以完全拋開操作系統(tǒng),在磁盤上留出一塊空間后直接對磁道、扇區(qū)進行管理。對文檔庫數(shù)據(jù)的存儲格式,可以用二進制格式保存,可以用XML,還可以用二進制XML。頁面描述語言(定義頁面上的文字、圖形、圖像等對象的方法)可以用PostScript,可以用PDF,可以用SPD(書生公司使用的頁面描述語言),當然也可以自定義??傊?,只要能夠?qū)崿F(xiàn)接口標準所定義的功能,任何實現(xiàn)方式都是可以的。
      例如,我們可以用XML來描述文檔庫數(shù)據(jù),當通用文檔模型是層次型的時候,可以完全對照建立相應(yīng)的XML樹。執(zhí)行創(chuàng)建操作時就在XML樹中增加一個結(jié)點,執(zhí)行刪除操作就刪掉相應(yīng)結(jié)點,執(zhí)行設(shè)置操作就設(shè)置相應(yīng)結(jié)點的屬性,執(zhí)行獲取操作就取出相應(yīng)結(jié)點的屬性并返回給應(yīng)用軟件,執(zhí)行查詢操作時就遍歷相關(guān)結(jié)點查找。
      以下是該實施例的進一步說明1.用XML來描述每個對象。也就是說,為每個對象都建立了一個對應(yīng)的XML樹。有的對象屬性比較簡單,其對應(yīng)的XML樹就只有根結(jié)點,有的對象比較復(fù)雜,其對應(yīng)的XML樹還有子結(jié)點。具體描述方法可以參見前面用XML來定義操作對象的說明。
      2.當新建一個文檔庫時就新建一個根結(jié)點為文檔庫對象的XML文件3.每當在文檔庫中插入一個對象時(如文字對象),就將該對象對應(yīng)的XML樹插入到插入位置的父結(jié)點(如層)之下。這樣,文檔庫中的每個對象都在文檔庫為根結(jié)點的XML樹中有一個對應(yīng)的結(jié)點4.當刪除一個對象時,就刪除該對象對應(yīng)的結(jié)點,其下屬所有子結(jié)點也都被刪除。刪除過程是從葉子結(jié)點開始自下而上遍歷的5.設(shè)置一個對象屬性時,將該對象對應(yīng)的結(jié)點的屬性設(shè)置成該屬性。如果該屬性是用子結(jié)點表示的,則設(shè)置對應(yīng)的子結(jié)點6.獲取一個對象屬性時,訪問該對象對應(yīng)的結(jié)點,根據(jù)該結(jié)點的屬性和子結(jié)點獲得該對象的屬性7.獲取一個對象的句柄時,返回該對象對應(yīng)結(jié)點的XML路徑8.復(fù)制一個對象(如頁面)到指定位置時,就將該對象對應(yīng)的結(jié)點開始的整個子樹都復(fù)制到目標位置對應(yīng)的父結(jié)點(如文檔)之下。如果是復(fù)制到另一個文檔庫中,則需要將該子樹引用的對象(如嵌入字庫)也一起復(fù)制過去
      9.執(zhí)行獲取版面信息指令時,先生成一個指定位圖格式的空白位圖,其尺寸和指定區(qū)域相同,然后遍歷指定頁面的所有版面對象,凡是位于指定區(qū)域內(nèi)(包括只有一部分在該區(qū)域內(nèi))的版面對象,都解釋其含義,并在版面上相應(yīng)體現(xiàn)。具體過程雖然比較復(fù)雜比較專業(yè),但均屬于現(xiàn)有RIP技術(shù)范疇,不在此贅述。
      10.在創(chuàng)建角色對象時,生成一對隨機PKI鑰對(例如512位的RSA密鑰),將公鑰存儲在角色對象中,將私鑰返回給應(yīng)用軟件11.當應(yīng)用軟件登錄時,隨機生成一塊(例如128字節(jié))數(shù)據(jù),用相應(yīng)角色對象中的公鑰加密該數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后比較驗證,如果正確則表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰,登錄成功。為保險起見,該認證過程可以重復(fù)三次,三次全部通過才算登錄成功12.當對某一對象進行簽名時,也就是對其對應(yīng)的結(jié)點開始的子樹進行簽名。為了能夠使簽名不受具體物理存儲方式的影響,需要先做一個正則化,使得邏輯上等效的變化(例如存儲位置的改變導致相應(yīng)指針的變化)不會影響簽名有效性。該正則化的方法如下a)對樹的某一結(jié)點,先將該結(jié)點的子結(jié)點數(shù)計算HASH值,然后再依次計算其類型和各個屬性的HASH值,按順序連接在子結(jié)點數(shù)HASH值的后面。對連接的結(jié)果再計算其HASH值,得到該結(jié)點的正則結(jié)果;b)從子樹的根節(jié)點開始,按照上述方法計算該結(jié)點的正則結(jié)果,并對其所有子結(jié)點,按照從左到右順序依次計算其正則結(jié)果,將子結(jié)點的正則結(jié)果按順序附加到父結(jié)點正則結(jié)果之后;c)這是一個深度優(yōu)先的遞歸過程。遞歸結(jié)束之后,即得到最終結(jié)果。
      d)如果需要對被引用的對象也一起做簽名,則可以將被引用對象也作為一個子結(jié)點處理,方法同上正則化以后,再做HASH并用角色的私鑰進行簽名就屬于現(xiàn)有技術(shù)了。
      在上述正則化過程中,我們可以把a)改成如下方案對樹的某一結(jié)點,將該結(jié)點的子結(jié)點數(shù)、類型及其各屬性用分隔符隔開后按照順序連接起來,對連接的結(jié)果計算其HASH值,得到該結(jié)點的正則結(jié)果;我們還可以把a)改成如下方案對樹的某一結(jié)點,其子結(jié)點數(shù)、類型及其各屬性的長度用分隔符隔開后按照順序連接起來,再與子結(jié)點數(shù)、類型、各屬性連接起來,即為該結(jié)點的正則結(jié)果;總之,a)可以是以下各種方案中的任意一種對樹的某一結(jié)點,其子結(jié)點數(shù)、類型、各屬性,子結(jié)點數(shù)/類型/各屬性的長度(可選的),原值或經(jīng)過特定變換(如HASH、壓縮),按照預(yù)定順序連接起來(直接連接或用分隔符隔開)上述預(yù)定順序的意思是,子結(jié)點數(shù)長度、類型長度、各屬性長度、子結(jié)點數(shù)、類型、各屬性可以按任意順序排列,只要是預(yù)定的順序即可b)、c)步驟也可以改為寬度優(yōu)先我們不難給出上述方案的各種變化方式,如每個結(jié)點的子結(jié)點數(shù)用分隔符隔開后按照深度優(yōu)先的順序連接起來,再與各結(jié)點其它數(shù)據(jù)的正則結(jié)果連接起來??傊?,只要對該子樹中的所有結(jié)點的子結(jié)點數(shù)、類型和各屬性,按照確定的方法排列在一起就屬于本實施例的變形。
      13.當對某一對象設(shè)置權(quán)限時,最簡單的實現(xiàn)方式是簡單記錄各角色對該對象(及其子對象)的權(quán)限,并在今后各角色訪問時加以比較,符合權(quán)限的則允許相應(yīng)操作,否則報錯返回。更好的實現(xiàn)方式是對相應(yīng)數(shù)據(jù)加密,并用密鑰來控制權(quán)限,如果該角色沒有相應(yīng)密鑰就沒有對應(yīng)的權(quán)限,這種方式抗攻擊能力要更強。具體方案為a)對受保護的數(shù)據(jù)區(qū)域(通常為一個子樹,對應(yīng)某對象及其所有子對象),有一對對應(yīng)的PKI密鑰對,用其中的加密密鑰對該數(shù)據(jù)區(qū)域進行加密b)對具有讀權(quán)限的角色,授予其解密密鑰,該角色可以用該密鑰解密該數(shù)據(jù)區(qū)域,從而正確讀取這些數(shù)據(jù)c)對具有寫權(quán)限的角色,將授予其加密密鑰,該角色可以將修改后的數(shù)據(jù)用該密鑰加密,從而可以正確寫入該區(qū)域的數(shù)據(jù)d)鑒于PKI的加密/解密效率較低,為提高運行效率,也可以用對稱密鑰來對該數(shù)據(jù)區(qū)域加密,加密密鑰用于對該對稱密鑰進行加密,解密密鑰用于解密經(jīng)過加密后的密鑰數(shù)據(jù),從而獲得正確的對稱密鑰。為防止只有讀權(quán)限的角色在獲得對稱密鑰后用其修改數(shù)據(jù),可以用加密密鑰來對該數(shù)據(jù)區(qū)域進行數(shù)字簽名,每次擁有寫權(quán)限的角色修改該數(shù)據(jù)區(qū)域后都重新做一次簽名,從而確保數(shù)據(jù)不會被沒有寫權(quán)限的角色篡改e)當授予某一角色加密密鑰或解密密鑰時,可以用該角色的公鑰對該密鑰加密后存儲,這樣只有擁有該角色的私鑰時才能取出該密鑰在本實施例中,本發(fā)明的文檔數(shù)據(jù)安全管理系統(tǒng)和方法是針對上述文檔庫系統(tǒng)而進行的描述,但本發(fā)明同樣適用除了以上提到的系統(tǒng)之外的任何文檔數(shù)據(jù)管理系統(tǒng)的情況。
      以下先詳細說明本發(fā)明的文檔數(shù)據(jù)安全管理系統(tǒng)文檔數(shù)據(jù)安全管理系統(tǒng)包括角色管理單元、安全會話通道單元、身份認證單元、訪問控制單元和簽名單元。
      角色管理單元包括至少一個角色。角色管理單元包括角色的創(chuàng)建、各角色的權(quán)限的授權(quán)、收回授權(quán)等。
      角色可以由至少一個唯一的ID號和至少一對唯一的PKI密鑰組成,但在角色對象中只存儲其ID號和公鑰,私鑰由應(yīng)用軟件掌握。ID號可以是任意的編號或字符串,只要不同角色都分配了不同的ID即可。PKI算法可以是ECC、RSA中的一種。
      在文檔庫中定義了若干角色,角色對象是文檔庫的子對象。如果對應(yīng)的通用文檔模型中沒有文檔庫對象,則角色是在文檔中定義的,即角色對象是文檔對象的子對象,此時本文檔安全管理系統(tǒng)中所說的文檔庫均用文檔替代。
      任何應(yīng)用軟件都可以創(chuàng)建新角色。新角色的初始權(quán)限是對任何對象都沒有任何權(quán)限??梢杂镁哂性偈跈?quán)權(quán)限的角色對新角色授予一定的權(quán)限。
      創(chuàng)建角色對象的指令返回一個密鑰,作為今后登錄該角色的依據(jù),需要應(yīng)用軟件妥善保管。該密鑰通常是PKI的私鑰。
      可以創(chuàng)建一個特殊的缺省角色。當存在缺省角色時,任何應(yīng)用軟件一打開文檔庫就視為自動以缺省角色身份登錄。
      以某個角色(或多個角色)登錄、執(zhí)行一系列操作、最后注銷的整個過程稱為會話。會話包括會話標志、登錄角色列表。會話可以通過安全會話通道單元中的安全會話通道進行。安全會話通道單元包括至少一個會話密鑰,用于加密在安全會話通道之間傳遞的數(shù)據(jù)。會話密鑰可以用非對稱密鑰,也可以用常用效率更高的對稱密鑰。
      身份認證單元用于當角色登錄時,對登錄的身份進行認證。身份認證的單位是角色,只有擁有某個角色的私鑰才能以這個角色的身份登錄。在登錄時,身份認證單元根據(jù)登錄角色的ID取出存儲在角色對象中的角色公鑰,按照前述的“挑戰(zhàn)—應(yīng)答”機制進行認證。
      當應(yīng)用軟件以某一角色身份登錄時,采用“挑戰(zhàn)—應(yīng)答”機制,即文檔庫系統(tǒng)用保存的角色公鑰加密一塊數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后返回給文檔庫系統(tǒng),如果正確表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰(為保險起見該認證過程可能會重復(fù)幾次)。采用“挑戰(zhàn)—應(yīng)答”機制可以更好地保護私鑰的安全性。
      可以同時以多個角色身份登錄,此時擁有的權(quán)限是各角色權(quán)限的并集。
      訪問控制單元,用于對文檔數(shù)據(jù)設(shè)置訪問控制權(quán)限,角色只能根據(jù)自己的訪問控制權(quán)限訪問文檔數(shù)據(jù)。我們甚至可以連權(quán)限數(shù)據(jù)都可以置于訪問控制的管理之下,這樣有的角色可以獲取其他人的權(quán)限,有的角色不能。但只有擁有再授權(quán)或收回授權(quán)權(quán)限的角色才能按照正常的再授權(quán)或收回授權(quán)方式改變角色的權(quán)限,而不允許直接寫入權(quán)限數(shù)據(jù)。
      可以指定任意角色對任意對象(文檔庫、文檔集、文檔、頁、層、對象組、版面對象等)的訪問權(quán)限。如果指定了對某個對象的訪問權(quán)限,則該權(quán)限將適用于其所有子對象。
      訪問權(quán)限包括是否可讀、是否可寫、是否可再授權(quán)(使其他角色擁有自己的部分或全部權(quán)限)、是否可收回授權(quán)(去掉其他角色的部分或全部授權(quán))及上述權(quán)限的排列組合,還可以定義更多權(quán)限(如不可打印)等。
      文檔庫的初始創(chuàng)建者具有對該文檔庫的所有權(quán)限。
      簽名單元,用于在安全系統(tǒng)中,對文檔數(shù)據(jù)的任意指定的邏輯數(shù)據(jù)進行簽名,角色利用私鑰通過文檔數(shù)據(jù)簽名單元中的簽名,驗證在邏輯數(shù)據(jù)中角色簽名的合法性。
      可以用某個角色的身份對各對象進行簽名。簽名范圍將包括該對象的子對象,以及引用到的對象。
      下面結(jié)合安全管理系統(tǒng)進一步詳細說明本發(fā)明的文檔數(shù)據(jù)安全管理方法
      如圖11所示,以下詳細說明各操作步驟1.新建一文檔庫時,角色管理單元自動將該文檔庫的缺省角色的權(quán)限設(shè)置為擁有所有權(quán)限,包括對所有對象的讀、寫、再授權(quán)和收回授權(quán)權(quán)限2.建立安全會話通道,啟動會話a)根據(jù)會話標志判斷是否已經(jīng)啟動會話,如果是,則完成建立安全會話通道的過程,否則繼續(xù);b)一方生成一對隨機PKI鑰對c)將公鑰發(fā)送給對方d)對方生成隨機對稱密鑰作為會話密鑰,并用該公鑰加密會話密鑰后傳回e)用私鑰解密出會話密鑰f)設(shè)置會話標志g)將登錄角色列表設(shè)置為缺省角色3.角色登錄a)應(yīng)用軟件提供所要登錄角色的ID和所登錄的文檔庫當應(yīng)用軟件登錄時,隨機生成一塊(例如128字節(jié))數(shù)據(jù),用相應(yīng)角色對象中的公鑰加密該數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后比較驗證,如果正確則表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰,登錄成功。為保險起見,該認證過程可以重復(fù)三次,三次全部通過才算登錄成功b)身份認證單元檢查會話中的登錄角色列表,如果該角色已經(jīng)登錄(包括缺省角色),則該步驟已經(jīng)完成,否則繼續(xù)c)身份認證單元取出存儲在角色對象中的角色公鑰d)身份認證單元生成一段隨機數(shù)據(jù)塊,用該角色的公鑰對該數(shù)據(jù)塊進行加密e)身份認證單元將加密后的數(shù)據(jù)塊發(fā)送給應(yīng)用軟件f)應(yīng)用軟件用該角色的私鑰進行解密,將解密后的數(shù)據(jù)發(fā)送給身份認證單元g)身份認證單元判斷傳回的數(shù)據(jù)是否正確,如果不正確則登錄失敗,否則繼續(xù)h)在會話的登錄角色列表中增加該角色4.創(chuàng)建新角色a)應(yīng)用軟件發(fā)出創(chuàng)建新角色指令b)角色管理單元生成一個唯一的角色ID號c)角色管理單元生成一對隨機的PKI鑰對在創(chuàng)建角色對象時,生成一對隨機PKI鑰對(例如512位的RSA密鑰),將公鑰存儲在角色對象中,將私鑰返回給應(yīng)用軟件。
      d)角色管理單元在文檔庫中創(chuàng)建一個角色對象,在角色對象中存儲上述ID號和公鑰,該角色的權(quán)限為空,即對所有對象都不擁有任何權(quán)限e)將ID號和私鑰返回給應(yīng)用軟件5.對角色R授與對對象O的權(quán)限P當對某一對象設(shè)置權(quán)限時,最簡單的實現(xiàn)方式是簡單記錄各角色對該對象(及其子對象)的權(quán)限,并在今后各角色訪問時加以比較,符合權(quán)限的則允許相應(yīng)操作,否則報錯返回。更好的實現(xiàn)方式是對相應(yīng)數(shù)據(jù)加密,并用密鑰來控制權(quán)限,如果該角色沒有相應(yīng)密鑰就沒有對應(yīng)的權(quán)限,這種方式抗攻擊能力要更強。
      a)應(yīng)用軟件發(fā)出授權(quán)請求b)角色管理單元計算登錄角色列表中所有角色對O的權(quán)限的并集,判斷該并集是否是P的超集并同時擁有再授權(quán)權(quán)限。如果否則授權(quán)失敗(所有角色都加在一起也沒有授權(quán)所需要的權(quán)限),否則繼續(xù)c)角色管理單元將對O的權(quán)限P增加到角色R的權(quán)限列表中。如果P不包含讀或?qū)懙臋?quán)限,則授權(quán)完成,否則繼續(xù)d)訪問控制單元單元檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則i.生成隨機對稱密鑰和隨機PKI密鑰ii.用對稱密鑰對O進行加密。如果O的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則該子對象保持不變對受保護的數(shù)據(jù)區(qū)域(通常為一個子樹,對應(yīng)某對象及其所有子對象),有一對對應(yīng)的PKI密鑰對,用其中的加密密鑰對該數(shù)據(jù)區(qū)域進行加密。
      iii.用PKI加密密鑰加密對稱密鑰,存儲加密后的密文,并對O進行簽名iv.檢查文檔庫中的所有角色,凡是對O具有讀權(quán)限的(這時O是該角色擁有讀權(quán)限的某個對象的子對象),用該角色的公鑰對解密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中;凡是對O具有寫權(quán)限的(這時O是該角色擁有讀權(quán)限的某個對象的子對象),用該角色的公鑰對加密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中v.轉(zhuǎn)到步驟he)從當前登錄的角色中,選擇對O具備相應(yīng)權(quán)限的角色f)將該角色權(quán)限列表中O的對應(yīng)密鑰(讀權(quán)限對應(yīng)解密密鑰,寫權(quán)限對應(yīng)加密密鑰,可讀可寫則包含兩個密鑰)的密文,發(fā)送給應(yīng)用軟件對具有讀權(quán)限的角色,授予其解密密鑰,該角色可以用該密鑰解密該數(shù)據(jù)區(qū)域,從而正確讀取這些數(shù)據(jù)。
      對具有寫權(quán)限的角色,將授予其加密密鑰,該角色可以將修改后的數(shù)據(jù)用該密鑰加密,從而可以正確寫入該區(qū)域的數(shù)據(jù)。
      g)應(yīng)用軟件用該角色的私鑰解密出密鑰,返回給訪問控制單元h)根據(jù)P的設(shè)定,使用目標角色R的公鑰,加密相應(yīng)的密鑰,生成對應(yīng)的密文,并存儲到R的權(quán)限列表中當授予某一角色加密密鑰或解密密鑰時,可以用該角色的公鑰對該密鑰加密后存儲,這樣只有擁有該角色的私鑰時才能取出該密鑰鑒于PKI的加密/解密效率較低,為提高運行效率,也可以用對稱密鑰來對該數(shù)據(jù)區(qū)域加密,加密密鑰用于對該對稱密鑰進行加密,解密密鑰用于解密經(jīng)過加密后的密鑰數(shù)據(jù),從而獲得正確的對稱密鑰。為防止只有讀權(quán)限的角色在獲得對稱密鑰后用其修改數(shù)據(jù),可以用加密密鑰來對該數(shù)據(jù)區(qū)域進行數(shù)字簽名,每次擁有寫權(quán)限的角色修改該數(shù)據(jù)區(qū)域后都重新做一次簽名,從而確保數(shù)據(jù)不會被沒有寫權(quán)限的角色篡改6.收回R對對象O的權(quán)限Pa)應(yīng)用軟件發(fā)出收回授權(quán)請求b)角色管理單元查找登錄角色列表中的所有角色,是否有對O的收回授權(quán)的權(quán)限。如果都沒有,則收回授權(quán)失敗,否則繼續(xù)c)從R對O的權(quán)限中去掉Pd)如果P包含讀或?qū)憴?quán)限,從R的權(quán)限列表中刪除對O的相應(yīng)解密密鑰和/或加密密鑰7.讀取對象Oa)應(yīng)用軟件發(fā)出需要讀取O的操作的指令b)訪問控制單元檢查登錄角色列表中所有角色對O的權(quán)限,確認是否至少有一個角色對O有讀權(quán)限。如果均無,則失敗,否則繼續(xù)c)檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象d)選擇一個對該對象有讀權(quán)限的角色e)將該角色權(quán)限列表中保存的該對象的解密密鑰的密文,發(fā)送給應(yīng)用軟件f)應(yīng)用軟件用該角色的私鑰解密出解密密鑰,返回給訪問控制單元g)訪問控制單元用該解密密鑰解密出該對象的對稱密鑰h)用該對稱密鑰解密出對象O的數(shù)據(jù)i)將解密后的數(shù)據(jù)返回給與應(yīng)用軟件8.寫對象Oa)應(yīng)用軟件發(fā)出需要修改O的操作的指令b)訪問控制單元檢查登錄角色列表中所有角色對O的權(quán)限,確認是否至少有一個角色對O有寫權(quán)限。如果均無,則失敗,否則繼續(xù)c)檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象O1d)選擇一個對O1有寫權(quán)限的角色e)將該角色權(quán)限列表中保存的O1的加密密鑰的密文,發(fā)送給應(yīng)用軟件f)應(yīng)用軟件用該角色的私鑰解密出O1的加密密鑰,返回給訪問控制單元g)用該加密密鑰加密O的新數(shù)據(jù)(如果O的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則仍然用其密鑰對該子對象加密)h)用加密后的數(shù)據(jù)覆蓋原數(shù)據(jù),完成寫入過程9.對對象O進行簽名a)應(yīng)用軟件發(fā)出對O進行簽名的指令b)訪問控制單元對對象O的數(shù)據(jù)進行正則化當對某一對象進行簽名時,也就是對其對應(yīng)的結(jié)點開始的子樹進行簽名。為了能夠使簽名不受具體物理存儲方式的影響,需要先做一個正則化,使得邏輯上等效的變化(例如存儲位置的改變導致相應(yīng)指針的變化)不會影響簽名有效性。該正則化的方法如下b1)對樹的某一結(jié)點,先將該結(jié)點的子結(jié)點數(shù)計算HASH值,然后再依次計算其類型和各個屬性的HASH值,按順序連接在子結(jié)點數(shù)HASH值的后面。對連接的結(jié)果再計算其HASH值,得到該結(jié)點的正則結(jié)果;b2)從子樹的根節(jié)點開始,按照上述方法計算該結(jié)點的正則結(jié)果,并對其所有子結(jié)點,按照從左到右順序依次計算其正則結(jié)果,將子結(jié)點的正則結(jié)果按順序附加到父結(jié)點正則結(jié)果之后;b3)這是一個深度優(yōu)先的遞歸過程。遞歸結(jié)束之后,即得到最終結(jié)果。
      b4)如果需要對被引用的對象也一起做簽名,則可以將被引用對象也作為一個子結(jié)點處理,方法同上正則化以后,再做HASH并用角色的私鑰進行簽名就屬于現(xiàn)有技術(shù)了。
      在上述正則化過程中,我們可以把b1)改成如下方案對樹的某一結(jié)點,將該結(jié)點的子結(jié)點數(shù)、類型及其各屬性用分隔符隔開后按照順序連接起來,對連接的結(jié)果計算其HASH值,得到該結(jié)點的正則結(jié)果;我們還可以把b1)改成如下方案對樹的某一結(jié)點,其子結(jié)點數(shù)、類型及其各屬性的長度用分隔符隔開后按照順序連接起來,再與子結(jié)點數(shù)、類型、各屬性連接起來,即為該結(jié)點的正則結(jié)果;總之,b1)可以是以下各種方案中的任意一種對樹的某一結(jié)點,其子結(jié)點數(shù)、類型、各屬性,子結(jié)點數(shù)/類型/各屬性的長度(可選的),原值或經(jīng)過特定變換(如HASH、壓縮),按照預(yù)定順序連接起來(直接連接或用分隔符隔開)。
      上述預(yù)定順序的意思是,子結(jié)點數(shù)長度、類型長度、各屬性長度、子結(jié)點數(shù)、類型、各屬性可以按任意順序排列,只要是預(yù)定的順序即可。
      b2)、b3)步驟也可以改為寬度優(yōu)先。
      我們不難給出上述方案的各種變化方式,如每個結(jié)點的子結(jié)點數(shù)用分隔符隔開后按照深度優(yōu)先的順序連接起來,再與各結(jié)點其它數(shù)據(jù)的正則結(jié)果連接起來。總之,只要對該子樹中的所有結(jié)點的子結(jié)點數(shù)、類型和各屬性,按照確定的方法排列在一起就屬于本實施例的變形。
      c)計算正則化結(jié)果的HASH值d)將HASH值發(fā)給應(yīng)用軟件e)應(yīng)用軟件用登錄角色列表中所有角色的私鑰對該HASH值進行加密(即簽名)f)應(yīng)用軟件將簽名結(jié)果返回給訪問控制單元g)訪問控制單元將簽名結(jié)果保存在數(shù)字簽名對象中10.注銷登錄角色a)應(yīng)用軟件發(fā)出注銷某個登錄角色的指令b)如果登錄角色列表中存在該角色,安全會話通道單元將該角色從登錄角色列表中去掉11.結(jié)束會話a)一方發(fā)出結(jié)束會話請求b)停止一切與當前會話相關(guān)的線程,消除會話標志,刪除登錄角色列表下面是本發(fā)明文檔數(shù)據(jù)安全管理方法的一個計算機實現(xiàn)的例子class UOI_RoleList:public UOI_Obj{public:
      //!獲得列表中角色的數(shù)目int GetRoleCount();//!按指定索引獲得角色UOI_Role*GetRole(int nIndex);//!創(chuàng)建角色/*!\param pPrivKey私鑰緩沖區(qū)\param pnKeyLen用于返回實際私鑰的長度\return新創(chuàng)建的角色*/UOI_Role AddRole(unsigned char*pPrivKey,int*pnKeyLen);//!構(gòu)造函數(shù)UOI_RoleList();//!析構(gòu)函數(shù)virtual~UOI_RoleList();};
      class UOI_Role:public UOI_Obj{public:
      //!構(gòu)造函數(shù)UOI_Role();//!析構(gòu)函數(shù)virtual~UOI_Role();//!獲得角色IDint GetRoleID();//!設(shè)置角色ID/*!\param nID角色ID*/void SetRoleID(int nID);//!獲得角色名稱const char*GetRoleName();//!設(shè)置角色名稱/*!
      \param szName角色名稱*/void SetRoleName(const char*szName);};class UOI_PrivList:public UOI_Obj//權(quán)限列表{public:
      //!獲得指定角色對應(yīng)的權(quán)限UOI_RolePriv*GetRolePriv(UOI_Role*pRole);//!新建某角色的權(quán)限項UOI_RolePriv*pPriv AddRole();//!獲得列表中角色權(quán)限項的數(shù)目int GetRolePrivCount();//!按索引值,獲得角色權(quán)限項UOI_RolePriv*GetRolePriv(int nIndex);//!構(gòu)造函數(shù)UOI_PrivList();//!析構(gòu)函數(shù)virtual~UOI_PrivList();
      };class UOI_RolePriv:public UOI_Obj //對應(yīng)于某一個角色的所有權(quán)限{public:
      //!獲得角色UOI_Role*GetRole();//!設(shè)置對某個對象的權(quán)限,當權(quán)限超過該角色對該對象的當前權(quán)限時為授權(quán),小于時為收回授權(quán)。當前登錄的角色必須有相應(yīng)的再授權(quán)或收回授權(quán)權(quán)限bool SetPriv(UOI_Obj*pObj,UOI_Priv*pPriv);//!獲得權(quán)限設(shè)置數(shù)量int GetPrivCount();//!獲得索引值對應(yīng)的權(quán)限設(shè)置的對象UOI_Obj*GetObj(int nIndex);//!獲得索引值對應(yīng)的權(quán)限設(shè)置的權(quán)限UOI_Priv*GetPriv(int nIndex);//!獲得對應(yīng)于某一個對象的的權(quán)限UOI_Priv*GetPriv(UOI_Obj*pObj);//!構(gòu)造函數(shù)UOI_RolePriv();
      //!析構(gòu)函數(shù)virtual~UOI RolePriv();};class UOI_Priv:public UOI_Obj{public:
      enum PrivType{//各權(quán)限類型定義PRIV_READ,//讀權(quán)限PRIV_WRITE,//寫權(quán)限PRIV_RELICENSE, //再授權(quán)權(quán)限PRIV_BEREAVE,//收回授權(quán)權(quán)限PRIV_PRINT,//打印權(quán)限其它權(quán)限定義}//!是否有相應(yīng)權(quán)限bool GetPriv(PrivType privType);//!設(shè)置相應(yīng)權(quán)限void SetPriv(PrivType privType,bool bPriv);
      //!構(gòu)造函數(shù)UOI_Priv();//!析構(gòu)函數(shù)virtual~UOI_Priv();};class UOI_SignList:public UOI_Obj{public:
      //!構(gòu)造函數(shù)UOI_SignList();//!析構(gòu)函數(shù)virtual~UOI_SignList();//!添加新的結(jié)點簽名,返回其索引值int AddSign(UOI_Sign*pSign);//!按指定索引值,獲得結(jié)點簽名UOI_Sign GetSign(int index);//!按指定索引值,刪除結(jié)點簽名void DelSign(int index);
      //!獲得列表中結(jié)點簽名的數(shù)目int GetSignCount();};class UOI_Sign:public UOI_Obj{public:
      //!構(gòu)造函數(shù)UOI_Sign();//!析構(gòu)函數(shù)virtual~UOI_Sign();//!執(zhí)行簽名/*!\param pDepList簽名所依賴的列表\param pRole用于簽名的角色\param pObj被簽名的對象*/void Sign(UOI_SignDepList pDepList,UOI_Role pRole,UOI_Obj pObj);
      //!驗證簽名bool Verify();//!獲得簽名的依賴列表UOI_SignDepList GetDepList();};class UOI_SignDepList:public UOI_Obj{public:
      //!構(gòu)造函數(shù)UOI_SignDepList();//!析構(gòu)函數(shù)virtual~UOI_SignDepList();//!加入一個依賴項void InsertSignDep(UOI_Sign*pSign);//!獲得依賴項的數(shù)目int GetDepSignCount();//!按指定索引值,獲得依賴項UOI_Sign*GetDepSign(int nIndex);
      };為了提高工作效率,在實施時還可以對上述步驟進行增強或簡化,例如將各角色私鑰緩存在會話數(shù)據(jù)中(會話結(jié)束后刪除),而不用每次都需要發(fā)到應(yīng)用軟件進行解密,或者省略一些安全措施,或者減少一些功能。總之,任何對上述方法進行簡化的方法都是本方法的變形。
      本實施例通過樹形的文檔庫管理系統(tǒng)結(jié)構(gòu)提供安全管理系統(tǒng),用角色進行身份認證,在與安全認證相關(guān)的操作的安全會話中,可以有多個角色登陸,利用不同的角色進行身份認證,權(quán)限控制或者簽名并驗證簽名。當訪問控制時,可以對任意的子樹的文檔數(shù)據(jù)指定安全控制的權(quán)限,而權(quán)限是由角色分配的。而在當前的安全會話中,對某個特定的子樹的文檔數(shù)據(jù)的權(quán)限是所有角色的權(quán)限的并集。在安全會話中,也可以對安全控制的文檔數(shù)據(jù)的權(quán)限進行授權(quán)與加收,而這樣的授權(quán)與回收都可以由角色來提供。而訪問控制通過加密來進行,加密可以針對任意的子樹文檔數(shù)據(jù)而進行。同時,可以對任意的子樹數(shù)據(jù)進行簽名和簽名驗證,而簽名是在安全會話過程中,用某個角色的私鑰進行的,進行簽名的私鑰可以是角色列表單元中的某個角色。在樹形結(jié)構(gòu)的文檔數(shù)據(jù)進行簽名前,可以進行正則化,以確保各個結(jié)點之間的數(shù)字簽名不相同。
      本發(fā)明給出了一個文檔數(shù)據(jù)安全管理系統(tǒng),提供了集成的身份認證機制、訪問控制機制和簽名驗證機制,對文檔數(shù)據(jù)進行身份認證、訪問控制、簽名不受特定文檔數(shù)據(jù)的限制,系統(tǒng)中所有可能的文檔數(shù)據(jù)都可以進行安全控制即認證、訪問控制、簽名及簽名驗證。
      本發(fā)明中所說明的文檔安全技術(shù),例如基于角色的權(quán)限管理、安全會話通道、角色的認證方式、多重角色登陸、對樹結(jié)構(gòu)的正則化技術(shù)、細粒度的權(quán)限管理單元、基于加密的權(quán)限設(shè)置等,都不僅適用于本發(fā)明所述的文檔處理系統(tǒng),還可以運用于更為廣泛的其它應(yīng)用場合。
      在本發(fā)明中,為了使本文檔處理系統(tǒng)能很好地模擬紙張的特性,提供了一種“只加不改”的技術(shù)方案。也就是說,每個應(yīng)用軟件都只在現(xiàn)有文檔內(nèi)容基礎(chǔ)上添加新的內(nèi)容,但不修改、不刪除已有的內(nèi)容,使文檔的一個頁面就象一張紙一樣,可以由不同的人用不同的筆在紙上不斷寫寫畫畫,但誰都不能修改、刪除已有內(nèi)容。具體方法是每個文檔的每一層只由一個應(yīng)用軟件來管理和維護,即每一個應(yīng)用軟件在編輯其它軟件生成的文檔時,都在現(xiàn)有文檔基礎(chǔ)上新增加一層,將本軟件新編輯的內(nèi)容都放到這一層中,不修改和刪除前面各層的內(nèi)容。由于現(xiàn)有社會就是基于紙張來運轉(zhuǎn)的,因此只要能符合紙張的特性就能滿足現(xiàn)有應(yīng)用的需求,具備足夠的實用價值。
      為了確保每一層內(nèi)容在生成后沒有被修改、刪除,我們可以利用每一層的數(shù)字簽名對象。數(shù)字簽名可以是對本層內(nèi)容進行簽名,更可以是對本層以及本層下面(即更早創(chuàng)建的)的所有層的內(nèi)容一起簽名。簽名以后并不妨礙對文檔做進一步的批注等編輯,只要新的內(nèi)容是位于新建的層,沒有修改破壞簽名時存在的各層,簽名依然是有效的,但簽名者只對簽名以前的內(nèi)容負責,不對簽名以后的內(nèi)容負責。這是一個非常符合應(yīng)用需求的技術(shù)方案,具有很大的實用價值。相比之下,現(xiàn)有的其它技術(shù)或者簽名后不允許編輯,或者編輯后(盡管是“只加不改”的編輯)簽名被破壞。
      前述技術(shù)方案不允許修改文檔中的已有內(nèi)容,即使不考慮與紙張?zhí)匦缘募嫒菀约皵?shù)字簽名問題,需要修改的話也只能做版面級編輯,即對每個版面對象的編輯(增、刪、改)都不會改變其它版面對象(這是由于通用通用文檔模型是基于可見部分為基礎(chǔ)構(gòu)建的,不包含大量不可見的、關(guān)于版面對象之間的關(guān)系,因此修改任何一個版面對象時,其它版面對象不會產(chǎn)生相應(yīng)的調(diào)整,例如刪掉一個字,就會在其位置留下空白,右邊的文字不會自動左移)。如果用戶需要對文檔中的已有內(nèi)容進行編輯,并且還希望能像在原來那樣編輯的話,有一個技術(shù)方案可以很好地滿足這個應(yīng)用需求。該方案是當應(yīng)用軟件完成初始編輯時,除了新建一層存放當前編輯的內(nèi)容外,還將源文件(按照應(yīng)用軟件自有的格式存儲,記錄了各對象之間完整關(guān)系的文件,例如.doc文件)嵌入到文檔中。當下次需要進行繼續(xù)編輯時,從文檔中取出該源文件,并使用該源文件繼續(xù)編輯。編輯完成后清除該軟件所管理的那一層,重新生成該層的內(nèi)容,并繼續(xù)將新修改的源文件嵌入到文檔中。
      具體方法如下1.應(yīng)用軟件第一次處理該文檔時,新建一層,將新編輯內(nèi)容對應(yīng)的版面對象插入到新建層中,同時用自身格式另存一份新編輯的內(nèi)容(即源文件)2.在文檔對象中新建一個源文件子對象,用來嵌入源文件(例如用二進制數(shù)據(jù)的方式整體嵌入),并記錄是哪一層對應(yīng)該源文件對象3.用同一應(yīng)用軟件再次編輯該文檔時,從對應(yīng)的源文件對象中取出對應(yīng)的源文件4.使用該源文件繼續(xù)編輯該層內(nèi)容。由于該源文件是該應(yīng)用軟件自身的格式,可以按照該應(yīng)用軟件自身的功能繼續(xù)對該層內(nèi)容進行編輯5.再次編輯結(jié)束后,根據(jù)新編輯后的結(jié)果更新該層內(nèi)容(例如用全部清除后全部重新生成的方式),同時將新修改后的源文件重新嵌入到文檔對象中6.如此循環(huán)往復(fù),就可以用原有應(yīng)用軟件按照原有方式對文檔中的已有內(nèi)容進行編輯采用上述技術(shù)方案,可以最大程度地實現(xiàn)文檔的互操作性。在應(yīng)用軟件、文檔都采用本發(fā)明技術(shù)時,可以實現(xiàn)(如果有足夠安全權(quán)限的話)1.對任何文檔,用任何應(yīng)用軟件都可以正確打開、顯示、打印2.對任何文檔,用任何應(yīng)用軟件都可以新添加任何內(nèi)容,而且不會破壞文檔已有簽名3.對任何文檔,在不必考慮文檔已有簽名(沒有簽名或者雖有簽名但允許破壞)的前提下,用任何應(yīng)用軟件都可以對文檔已有內(nèi)容進行版面級編輯4.對任何文檔,使用文檔已有內(nèi)容的原始編輯軟件可以對該內(nèi)容進行正常編輯由此可見,通過本發(fā)明中對層的管理,對文檔的管理、互操作、安全設(shè)置都帶來極大的便利。
      下面我們以A軟件創(chuàng)建一個文檔并且B軟件對其進行編輯為例說明其工作過程。為了節(jié)約篇幅起見,在本例中我們選用UOI作為接口標準1.A軟件發(fā)出指令,創(chuàng)建文檔庫c:\sample\mydocbase.sep,將其句柄存放在hDocBaseUOI_Open(“c:\\sample\\mydocbase.sep”,TRUE,&amp;hDocBase);文檔庫系統(tǒng)執(zhí)行該指令,創(chuàng)建一個文件名為c:\sample\mydocbase.sep的新的XML文件,其根結(jié)點為文檔庫對象,將其句柄返回給應(yīng)用軟件
      2.A軟件發(fā)出指令,在文檔庫hDocBase中新建文檔集,將其句柄存放在hDocSethDocSet=InsertNewObj(hDocBase,0,UOI_Obj::TYPE_DOCSET);文檔庫系統(tǒng)執(zhí)行該指令,在文檔庫對象結(jié)點下添加一個文檔集子結(jié)點,,將其句柄返回給應(yīng)用軟件3.A軟件發(fā)出指令,在文檔集hDocBase中新建文檔,將其句柄存放在hDochDoc=InsertNewObj(hDocSet,0,UOI_Obj::TYPE_DOC);文檔庫系統(tǒng)執(zhí)行該指令,在hDocBase對應(yīng)的結(jié)點下添加一個文檔結(jié)點,將其句柄返回給應(yīng)用軟件4.A軟件發(fā)出指令,在文檔hDoc中新建一頁,版心大小是寬w,高h,將其句柄存放在hPageUOI_Page page;page.size.w=w;page.size.h=h;UOI_Insert(hDoc,0,&amp;page,&amp;hPage);文檔庫系統(tǒng)執(zhí)行該指令,在hDoc對應(yīng)的結(jié)點下添加一個頁結(jié)點,其版心屬性按寬w高h設(shè)置,將其句柄返回給應(yīng)用軟件5.A軟件發(fā)出指令,在頁hPage中創(chuàng)建一層,將其句柄存放在hLayerhLayer=InertNewObj(hPage,0,UOI_Obj::TYPE LAYER);文檔庫系統(tǒng)執(zhí)行該指令,在hPage對應(yīng)的結(jié)點下添加一個層結(jié)點,將其句柄返回給應(yīng)用軟件6.A軟件發(fā)出指令,設(shè)置字號為sUOI_CharSizecharSize;charSize.m_Width=charSize.m_Height=s;UOI_Insert(hLayer,0,&amp;charSize);文檔庫系統(tǒng)執(zhí)行該指令,在hLayer對應(yīng)的結(jié)點下添加一個字號結(jié)點,其寬高屬性都設(shè)置為s,將其句柄返回給應(yīng)用軟件
      7.A軟件發(fā)出指令,在坐標(x1,y1)位置插入文字串“書生意氣揮斥方遒”UOI_Text text;text.m_pText=Duplicate(“書生意氣揮斥方遒”);text.m_Encoding=UOI_Text::ENCODE_GB13000;text.m_Start.x=x1;text.m_Start.y=y(tǒng)1;UOI_Insert(hLayer,1,&amp;text);文檔庫系統(tǒng)執(zhí)行該指令,在hLayer對應(yīng)的結(jié)點下再添加一個文字子結(jié)點,其文字數(shù)據(jù)為“書生意氣揮斥方遒”,其字符編碼方式為GB13000,文字起點為(x1,y1),并將其句柄返回給應(yīng)用軟件8.A軟件發(fā)出指令,關(guān)閉文檔庫hDocBaseUOI_Close(NULL,hDocBase);文檔庫系統(tǒng)執(zhí)行該指令,關(guān)閉文件c:\sample\mydocbase.sep9.B軟件發(fā)出指令,打開文檔庫c:\sample\mydocbase.sep,將其句柄存放在hDocBaseUOI_Open(“c:\\sample\\mydocbase.sep”,F(xiàn)ALSE,&amp;hDocBase);文檔庫系統(tǒng)執(zhí)行該指令,打開文件c:\sample\mydocbase.sep10.B軟件發(fā)出指令,獲取文檔庫hDocBase第一個文檔集的指針,將其句柄存放在hDocSetUOI_GetHandle(hDocBase,0,&amp;hDocSet);文檔庫系統(tǒng)執(zhí)行該指令,尋找根結(jié)點下第一個類型為文檔集的子結(jié)點,將其句柄返回給應(yīng)用軟件11.B軟件發(fā)出指令,獲取文檔集hDocSet第一個文檔的指針,將其句柄存放在hDocUOI_GetHandle(hDocSet,0,&amp;hDoc);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDocSet對應(yīng)的結(jié)點下第一個類型為文檔的子結(jié)點,將其句柄返回給應(yīng)用軟件12.B軟件發(fā)出指令,獲取文檔hDoc第一頁的指針,將其句柄存放在hPageUOI_GetHandle(hDoc,0,&amp;hPage);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDoc對應(yīng)的結(jié)點下第一個類型為頁的子結(jié)點,將其句柄返回給應(yīng)用軟件13.B軟件獲取該頁版面位圖,用于顯示該頁UOI_GetPageBmp(hPage,rect,buf);文檔庫系統(tǒng)執(zhí)行該指令,按照前述方法(文檔庫系統(tǒng)實施例說明第9條)生成hPage對應(yīng)的頁的版面位圖,將其返回給應(yīng)用軟件14.B軟件發(fā)出指令,獲取hPage第一層的指針,將其句柄存放在hLayerUOI_GetHandle(hPage,0,&amp;hLayer);文檔庫系統(tǒng)執(zhí)行該指令,尋找hPage對應(yīng)的結(jié)點下第一個類型為層的子結(jié)點,將其句柄返回給應(yīng)用軟件15.B軟件發(fā)出指令,獲取第一個版面對象的句柄hObjUOI_GetHandle(hLayer,0,&amp;hObj);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDocSet對應(yīng)的結(jié)點下第一個子結(jié)點,將其句柄返回給應(yīng)用軟件16.B軟件發(fā)出指令,獲取hObj的類型UOI_GetObjType(hObj,&amp;type);文檔庫系統(tǒng)執(zhí)行該指令,獲取hObj對應(yīng)的結(jié)點的類型,將其返回給應(yīng)用軟件17.B軟件發(fā)現(xiàn)這是一個字號對象,獲取該對象UOI_GetObj(hObj,&amp;charSize);文檔庫系統(tǒng)執(zhí)行該指令,獲取hObj對應(yīng)的結(jié)點的數(shù)據(jù),將其返回給應(yīng)用軟件18.B軟件將字高放大一倍charSize.m_Height*=2;UOI_SetObj(hObj,&amp;charSize);文檔庫系統(tǒng)執(zhí)行該指令,設(shè)置hObj對應(yīng)的結(jié)點的屬性19.B軟件重新獲取版面位圖并顯示,這時會發(fā)現(xiàn)屏幕上的“書生意氣揮斥方遒”變成長體字了下面,參照圖10描述依照本發(fā)明的文檔操作系統(tǒng)執(zhí)行一操作的一個例子。在該例子中,應(yīng)用軟件通過統(tǒng)一的接口標準(UOML接口)請求對文檔的操作。文檔庫系統(tǒng)可能會有不同廠商的不同型號,但是對于應(yīng)用開發(fā)廠商來說面向的都是同一個接口標準,因此都可以與之配套使用。
      在本發(fā)明中,不同的應(yīng)用軟件可以同時或不同時調(diào)用同一個文檔庫系統(tǒng),同一應(yīng)用軟件可以同時或不同時調(diào)用不同的文檔庫系統(tǒng)。
      依照本發(fā)明,使得應(yīng)用層和數(shù)據(jù)處理層分離,使得同一文檔能在不同的應(yīng)用軟件之間通用,使不同應(yīng)用軟件之間具有良好的文檔互操作性。
      依照本發(fā)明,形成產(chǎn)業(yè)分工,減少重復(fù)開發(fā),并更加專業(yè)、完備、正確;對文檔的基本操作都在文檔庫系統(tǒng)中處理,各應(yīng)用軟件不必重復(fù)開發(fā)。而且由于文檔庫系統(tǒng)是由專業(yè)廠商開發(fā),相關(guān)技術(shù)的專業(yè)性、完備性、正確性較有保障,而且應(yīng)用軟件廠商和用戶可以選擇做的最好的一家文檔庫系統(tǒng)廠商,從而保證處理效果的正確性和一致性。
      依照本發(fā)明,提供多文檔甚至海量文檔的管理機制,使文檔之間能夠有效組織起來,便于檢索、查詢、保管,便于嵌入較強的信息安全機制。
      依照本發(fā)明,提供更好的安全機制,可以設(shè)置多種角色,細粒度地設(shè)置每個角色的權(quán)限。其中細粒度是雙重的,一方面可以對整個文檔或文檔的一個細微之處進行權(quán)限設(shè)置,另一方面可以設(shè)置種類非常多的權(quán)限,而不僅僅是傳統(tǒng)的讀/寫/不可訪問三級。
      依照本發(fā)明,鼓勵創(chuàng)新,合理競爭。形成合理的產(chǎn)業(yè)分工后,各文檔庫系統(tǒng)廠商和各應(yīng)用軟件廠商就會在領(lǐng)域展開競爭,而不會再出現(xiàn)MicrosoftWord一樣靠文檔格式來壟斷應(yīng)用軟件的情形發(fā)生。各文檔庫系統(tǒng)廠商也可以在標準之外增加新的功能以吸引用戶,標準并不會對創(chuàng)新形成束縛。
      依照本發(fā)明,便于優(yōu)化性能,有更好的可移植性和可伸縮性。無論是什么平臺,什么樣的性能,都可以遵循同樣的調(diào)用接口,使得在不改變接口標準的情況下可以不斷優(yōu)化性能,并移植到不同的平臺。
      權(quán)利要求
      1.一種文檔數(shù)據(jù)安全管理系統(tǒng),包括文檔數(shù)據(jù),其特征在于,還包括角色管理單元,所述角色管理單元包括至少一個角色,用于角色的創(chuàng)建、各角色的權(quán)限的授權(quán)、收回授權(quán)。
      2.根據(jù)權(quán)利要求1所述的文檔數(shù)據(jù)安全管理系統(tǒng),還包括安全會話通道單元,所述安全會話通道單元包括至少一個會話密鑰和至少一個安全會話通道,用于加密在安全會話通道之間傳遞的數(shù)據(jù);角色會話通過安全會話通道單元中的安全會話通道進行。
      3.根據(jù)權(quán)利要求1所述的安全管理系統(tǒng),其特征在于,所述角色由至少一個唯一的序列號和至少一對唯一的PKI密鑰組成。
      4.根據(jù)權(quán)利要求1或2所述的安全管理系統(tǒng),其特征在于,還包括身份認證單元,用于當角色登錄時,對登錄的身份進行認證,只有擁有角色的私鑰才能以這個角色的身份登錄。
      5.根據(jù)權(quán)利要求1或2所述的安全管理系統(tǒng),其特征在于,還包括訪問控制單元,用于對文檔數(shù)據(jù)設(shè)置訪問控制權(quán)限,角色只能根據(jù)自己的訪問控制權(quán)限訪問文檔數(shù)據(jù)。
      6.根據(jù)權(quán)利要求1或2所述的安全管理系統(tǒng),其特征在于,還包括簽名單元,用于對文檔數(shù)據(jù)的任意指定的邏輯數(shù)據(jù)進行簽名,角色利用私鑰通過文檔數(shù)據(jù)簽名單元中的簽名,驗證在邏輯數(shù)據(jù)中角色簽名的合法性。
      7.一種文檔數(shù)據(jù)安全管理方法,其特征在于,包括下列步驟步驟A安全會話通道單元建立安全會話通道,啟動會話;步驟B角色登錄。
      8.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,還包括下列步驟步驟C新建文檔數(shù)據(jù)時,角色管理單元將該文檔數(shù)據(jù)的缺省角色的權(quán)限設(shè)置為擁有所有權(quán)限。
      9.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,還包括下列步驟步驟D創(chuàng)建新角色。
      10.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,還包括下列步驟步驟E對角色授與對對象的權(quán)限;步驟F收回角色對對象的權(quán)限;步驟G讀取對象;步驟H寫對象。
      11.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,還包括下列步驟步驟I對對象進行簽名。
      12.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,還包括下列步驟步驟J注銷登錄角色;步驟K結(jié)束會話。
      13.根據(jù)權(quán)利要求8所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟C中所述的權(quán)限為對所有對象的讀、寫、再授權(quán)和收回授權(quán)權(quán)限。
      14.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟A包括下列步驟A1)根據(jù)會話標志判斷是否已經(jīng)啟動會話,如果是,則完成建立安全會話通道的過程,否則繼續(xù);A2)一方生成一對隨機PKI鑰對;A3)將公鑰發(fā)送給對方;A4)對方生成隨機對稱密鑰作為會話密鑰,并用該公鑰加密會話密鑰后傳回;A5)用私鑰解密出會話密鑰;A6)設(shè)置會話標志。
      15.根據(jù)權(quán)利要求7所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟B包括下列步驟B1)應(yīng)用軟件提供所要登錄角色的ID和所登錄的文檔數(shù)據(jù);B2)身份認證單元檢查會話中的登錄角色列表,如果該角色已經(jīng)登錄,則該步驟已經(jīng)完成,否則繼續(xù);B3)身份認證單元取出存儲在角色對象中的角色公鑰;B4)身份認證單元生成一段隨機數(shù)據(jù)塊,用該角色的公鑰對該數(shù)據(jù)塊進行加密;B5)身份認證單元將加密后的數(shù)據(jù)塊發(fā)送給應(yīng)用軟件;B6)應(yīng)用軟件用該角色的私鑰進行解密,將解密后的數(shù)據(jù)發(fā)送給身份認證單元;B7)身份認證單元判斷傳回的數(shù)據(jù)是否正確,如果不正確則登錄失敗,否則繼續(xù);B8)在會話的登錄角色列表中增加該角色。
      16.根據(jù)權(quán)利要求9所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟D包括下列步驟D1)應(yīng)用軟件發(fā)出創(chuàng)建新角色指令;D2)角色管理單元生成一個唯一的角色ID號;D3)角色管理單元生成一對隨機的PKI鑰對;D4)角色管理單元在文檔數(shù)據(jù)中創(chuàng)建一個角色對象,在角色對象中存儲上述ID號和公鑰,該角色的權(quán)限為空;D5)將ID號和私鑰返回給應(yīng)用軟件。
      17.根據(jù)權(quán)利要求10所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟E包括下列步驟E1)應(yīng)用軟件發(fā)出授權(quán)請求;E2)角色管理單元計算登錄角色列表中所有角色對對象的權(quán)限的并集,判斷該并集是否是權(quán)限的超集并同時擁有再授權(quán)權(quán)限,如果否,則授權(quán)失?。环駝t繼續(xù);E3)角色管理單元將對對象的權(quán)限增加到角色的權(quán)限列表中。如果權(quán)限不包含讀或?qū)懙臋?quán)限,則授權(quán)完成;否則繼續(xù);E4)訪問控制單元單元檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限,如果是,則從當前登錄的角色中,選擇對對象具備相應(yīng)權(quán)限的角色;E5)將該角色權(quán)限列表中對象的對應(yīng)密鑰的密文,發(fā)送給應(yīng)用軟件;E6)應(yīng)用軟件用該角色的私鑰解密出密鑰,返回給訪問控制單元;E7)根據(jù)權(quán)限的設(shè)定,使用角色的公鑰,加密相應(yīng)的密鑰,生成對應(yīng)的密文,并存儲到角色的權(quán)限列表中。
      18.根據(jù)權(quán)利要求17所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟E4還包括下列步驟步驟E41)生成隨機對稱密鑰和隨機PKI密鑰;步驟E42)用對稱密鑰對對象進行加密;如果對象的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則該子對象保持不變;步驟E43)用PKI加密密鑰加密對稱密鑰,存儲加密后的密文,并對對象進行簽名;步驟E44)檢查文檔數(shù)據(jù)中的所有角色,凡是對對象具有讀權(quán)限的,用該角色的公鑰對解密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中;凡是對對象具有寫權(quán)限的,用該角色的公鑰對加密密鑰進行加密,將加密后的密文存儲到該角色的權(quán)限列表中;步驟E45)轉(zhuǎn)到步驟E5。
      19.根據(jù)權(quán)利要求10所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟F包括下列步驟F1)應(yīng)用軟件發(fā)出收回授權(quán)請求;F2)角色管理單元查找登錄角色列表中的所有角色,是否有對對象的收回授權(quán)的權(quán)限。如果都沒有,則收回授權(quán)失敗,否則繼續(xù);F3)從角色對對象的權(quán)限中去掉該權(quán)限;F4)如果權(quán)限包含讀或?qū)憴?quán)限,從角色的權(quán)限列表中刪除對對象的相應(yīng)解密密鑰和/或加密密鑰。
      20.根據(jù)權(quán)利要求10所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟G包括下列步驟G1)應(yīng)用軟件發(fā)出需要讀取對象的操作的指令G2)訪問控制單元檢查登錄角色列表中所有角色對對象的權(quán)限,確認是否至少有一個角色對對象有讀權(quán)限;如果均無,則失?。环駝t繼續(xù);G3)檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限;如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象;G4)選擇一個對該對象有讀權(quán)限的角色;G5)將該角色權(quán)限列表中保存的該對象的解密密鑰的密文,發(fā)送給應(yīng)用軟件;G6)應(yīng)用軟件用該角色的私鑰解密出解密密鑰,返回給訪問控制單元;G7)訪問控制單元用該解密密鑰解密出該對象的對稱密鑰;G8)用該對稱密鑰解密出對象的數(shù)據(jù);G9)將解密后的數(shù)據(jù)返回給與應(yīng)用軟件。
      21.根據(jù)權(quán)利要求10所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟H包括下列步驟H1)應(yīng)用軟件發(fā)出需要修改對象的操作的指令;H2)訪問控制單元檢查登錄角色列表中所有角色對對象的權(quán)限,確認是否至少有一個角色對對象有寫權(quán)限;如果均無,則失敗;否則繼續(xù);H3)檢查對象是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限;如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象;H4)選擇一個對對象有寫權(quán)限的角色;H5)將該角色權(quán)限列表中保存的對象的加密密鑰的密文,發(fā)送給應(yīng)用軟件;H6)應(yīng)用軟件用該角色的私鑰解密出對象的加密密鑰,返回給訪問控制單元;H7)用該加密密鑰加密對象的新數(shù)據(jù);H8)用加密后的數(shù)據(jù)覆蓋原數(shù)據(jù),完成寫入過程。
      22.根據(jù)權(quán)利要求11所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟I包括下列步驟I1)應(yīng)用軟件發(fā)出對對象進行簽名的指令;I2)訪問控制單元對對象的數(shù)據(jù)進行正則化;I3)計算正則化結(jié)果的HASH值;I4)將HASH值發(fā)給應(yīng)用軟件;I5)應(yīng)用軟件用登錄角色列表中所有角色的私鑰對該HASH值進行加密;I6)應(yīng)用軟件將簽名結(jié)果返回給訪問控制單元;I7)訪問控制單元將簽名結(jié)果保存在數(shù)字簽名對象中。
      23.根據(jù)權(quán)利要求22所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟I2包括下列步驟I21)計算樹的一結(jié)點的正則結(jié)果;I22)從子樹的根節(jié)點開始,按照上述方法計算該結(jié)點的正則結(jié)果,并對其所有子結(jié)點,按照從左到右順序依次計算其正則結(jié)果,將子結(jié)點的正則結(jié)果按順序附加到父結(jié)點正則結(jié)果之后;I23)這是一個深度優(yōu)先的遞歸過程,遞歸結(jié)束之后,即得到最終結(jié)果;I24)如果需要對被引用的對象也一起做簽名,則可以將被引用對象也作為一個子結(jié)點處理。
      24.根據(jù)權(quán)利要求23所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟I21包括下列步驟I211)先將該結(jié)點的子結(jié)點數(shù)計算HASH值,然后再依次計算其類型和各個屬性的HASH值,按順序連接在子結(jié)點數(shù)HASH值的后面;對連接的結(jié)果再計算HASH值,根據(jù)HASH值得到一結(jié)點的正則結(jié)果。
      25.根據(jù)權(quán)利要求23所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟I21包括下列步驟I212)將該結(jié)點的子結(jié)點數(shù)、類型及其各屬性用分隔符隔開后按照順序連接起來,對連接的結(jié)果計算其HASH值,根據(jù)HASH值得到一結(jié)點的正則結(jié)果。
      26.根據(jù)權(quán)利要求23所述的文檔數(shù)據(jù)安全管理方法,其特征在于,所述步驟I21包括下列步驟I213)將該子結(jié)點數(shù)、類型及其各屬性的長度用分隔符隔開后按照順序連接起來,再與子結(jié)點數(shù)、類型、各屬性連接起來,得到該結(jié)點的正則結(jié)果。
      全文摘要
      一種文檔數(shù)據(jù)安全管理系統(tǒng)和方法。包括文檔數(shù)據(jù),還包括角色管理單元、安全會話通道單元;角色管理單元包括至少一個角色,用于角色的創(chuàng)建、各角色的權(quán)限的授權(quán)、收回授權(quán);安全會話通道單元包括至少一個會話密鑰和至少一個安全會話通道,用于加密在安全會話通道之間傳遞的數(shù)據(jù);角色會話通過安全會話通道單元中的安全會話通道進行。文檔數(shù)據(jù)安全管理系統(tǒng)還包括身份認證單元;訪問控制單元;簽名單元。其具有強大的嵌入式信息安全功能,在核心層緊密結(jié)合信息安全技術(shù),為文檔提供最大程度的安全性。
      文檔編號G06F17/30GK1979511SQ20051013107
      公開日2007年6月13日 申請日期2005年12月9日 優(yōu)先權(quán)日2005年12月9日
      發(fā)明者王東臨, 郭旭, 劉昌偉, 鄒開紅 申請人:北京書生國際信息技術(shù)有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1