繁体   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