簡體   English   中英

將未加密的標簽數據附加到加密文件

[英]Attach unencrypted tag data to encrypted file

我希望這是我提出問題的正確地方,因為肯定有多種方法可以解決此問題。

我有壓縮和加密的文件格式(xml)。 現在,我想將一些基本的未加密元數據附加到我的文件中,以便於訪問某些參數。

正確的方法來做我想做的事情,否則要牢記一些最佳實踐?

我現在正在考慮的方法是在C#中使用Bouncy Castle加密我的實際數據,同時將標簽數據放在文件的前面。

例如

<metadata>
    //tag information about the file
</metadata>
<secretdata>
    //Grandma's secret recipe
</secretdata>

僅加密機密數據

<metadata>
    //tag information about the file
</metadata>
^&RF&^Tb87tyfg76rfvhjb8
hnjikhuhik*&GHd65rh87yn
NNCV&^FVU^R75rft78b875t

像您一樣使用XML組合非加密和加密數據確實是一種方法。 有一些缺點可能與您遇到的情況不相關:

  • 壓縮是相當有限的。 如果加密的數據很大,則應考慮直接以二進制格式存儲。 同樣,盡管您可以放入CDATA中的字符范圍也受到限制,但CDATA可能是一個折衷方案。

  • 如果加密的數據很大,XML的解析可能會很慢。 另外,它通常需要將整個文檔保留在內存中,這可能不是您想要的。 同樣,直接以二進制格式存儲加密的數據是一種解決方案。 CDATA在這里無濟於事。

  • XML的好處是人類可以閱讀。 盡管與元數據有關,但是無論如何大多數數據都被加密似乎很奇怪。

您可能會考慮的其他替代方案:

  1. 並排兩個文件。 一個將包含二進制數據,另一個(名稱相同,但擴展名不同)將具有元數據(例如XML格式)。 困難在於您必須處理以下情況,例如存在二進制數據文件但不存在相應的元數據文件或相反的情況,以及復制/移動數據( NTFS具有事務處理 ,但必須使用Interop,除非.NET Framework的最新版本增加了對事務性NTFS的支持。

  2. 元數據和加密數據以二進制格式存儲在單個文件中。 斯科特弗弗爾(scottfavre)的答案顯示了這樣做的一種可能性。 我同意他的解釋,但寧願也壓縮元數據有兩個原因:(1)節省空間;(2)防止最終用戶手動修改元數據,這將使標頭無效。

    我不推薦使用單個二進制文件方法,因為它會使格式難以使用。 如果您發現(進行足夠的基准測試和性能分析之后)發現存在重要的性能優勢,那么這種情況就是有效的。

  3. 存儲在備用數據流中的元數據 (只能在NTFS中使用,因此請注意FAT格式的閃存驅動器)。 在這里,好處是您不必處理存儲在標頭中的偏移量:NTFS會為您做到這一點。 但這不是我推薦的方法,除非您絕對需要將數據與文件保存在一起,並且您知道文件將始終存儲在NTFS磁盤上(並與支持ADS的應用程序一起傳輸)。

這里的一個挑戰是將純文本XML從文件的開頭移開,同時將輸入流恰好位於加密和壓縮數據的開始位置。 由於C#中的XML讀取庫不是在考慮這種用法的情況下構建的,因此它們的運行情況可能不佳(例如,讀取器讀取的字節可能超過所需的字節數,從而使基礎流超出了加密數據的開頭)。

一種可能的處理方式是,以提供XML元數據長度的眾所周知的格式來添加標頭。 因此該文件看起來像:

Header (5 bytes):
    Version* (1 byte, unsigned int)         = 1
    Metadata Length** (4 bytes, unsigned int) = N

Metadata (N bytes):
    well formed XML

Encrypted Data (rest of file)

(*-定義文件格式時包括版本控制始終是一個好主意)

(**-如果元數據的長度超出32位uint的范圍,則應考慮其他解決方案。)

然后,您可以直接讀取5個字節的標頭,解析出XML的長度,准確地讀取多個字節,並且輸入流應該在正確的位置以開始解密和解壓縮文件的其余部分。

當然,既然您已經有了一個二進制標頭,則可以考慮僅在標頭本身中包含元數據,而不是將其放入XML中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM