在Java中正确处理自己的文件格式

时间:2015-08-04 15:52:06

标签: java android encryption checksum file-format

我必须为Android应用程序创建自定义文件格式(基于字节)。 格式的主要目的是保存AES加密文件(字节数据)和解密它所需的一些元数据(例如IV,Salt和几个应用程序设置)。

关于如何设计和实现这个问题我有几个问题:

  1. 文件中的必填字段是什么?
  2. 目前的想法是从4个字节的幻数开始,然后是格式的版本号。接下来是IV和Salt。然后我将包括原始(未加密)数据的前4kb的校验和,因此我可以快速解密第一个4kb并检查提供的密钥是否正确。然后是整个原始(未加密)数据的校验和,这样我也可以检查整个文件。 这是标题。 (我需要((未)加密的)数据的长度吗?数据的偏移量?整个(标题+正文)文件的校验和?)

    对于正文(现在加密)我想添加原始文件名和扩展名(应该使用多少字节?)。 然后是原始文件。

    1. 在Java中读/写这种基于字节的文件的最佳方法是什么?
    2. 我找到的两个主要方法是ByteArrayOutputStreams和RandomAccessFiles。使用第一个选项我缺少搜索选项,比如如何在特定位置写入(即校验和)?第二个似乎运作良好,但也许有更好的解决方案可用。

1 个答案:

答案 0 :(得分:0)

对于我的H2数据库,我实现了一个文件系统抽象,具有多个文件系统实现,包括encrypted file。还有许多其他文件系统实现,例如缓存包装器等等。

我会使用XTSXEX-based tweaked-codebook mode with ciphertext stealing),这就是我实施的内容。它允许随机访问读取和写入,并且比纯AES慢得多。

你建议的标题对我来说听起来不错:幻数,然后是格式的版本号。我结合了幻数和版本号(不同的版本会产生不同的幻数)。使用XTS,不需要IV。 Salt,我会使用很多,例如8个字节。我还存储了散列迭代来散列密码,我使用了PBKDF2。我认为使用像PBKDF2这样的东西很重要。

我将标头长4096字节,以匹配常规文件系统的块大小。如果您使用固定的块大小进行读写,这应该可以提高性能。我没有使用任何校验和,因为我的底层(未加密)文件有校验和。我认为这足够好,并且可能比存储未加密的未加密数据校验和更安全,但我不确定。

对于API,使用$('#run').click(function () { var geojson = $.parseJSON($('#geojson').val()); // Initiate the chart $('#container').slideDown().highcharts('Map', { series: [{ mapData: geojson }] }); }); ByteBuffer都很好。使用byte[],支持内存映射文件更简单。