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

标签 java android encryption checksum file-format

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

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

  1. 文件中的必填字段有哪些?

当前的想法是从 4 个字节的魔数(Magic Number)开始,然后是格式的版本号。接下来是 IV 和 Salt。然后我将包含原始(未加密)数据的前 4kb 的校验和,这样我就可以快速解密前 4kb 并检查提供的 key 是否正确。然后是整个原始(未加密)数据的校验和,这样我也可以检查整个文件。 这就是标题。 (我需要((未)加密)数据的长度吗?数据偏移量?整个( header +正文)文件的校验和?)

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

  • 在 Java 中读取/写入此类基于字节的文件的最佳方法是什么?
  • 我发现的两个主要方法是 ByteArrayOutputStreams 和 RandomAccessFiles。使用第一个选项时,我缺少查找选项,例如如何在特定位置(即校验和)写入?第二种似乎效果很好,但也许还有更好的解决方案。

    最佳答案

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

    我会使用XTS ( XEX-based tweaked-codebook mode with ciphertext stealing ),这就是我实现的。它允许随机访问读写,并且比纯 AES 慢不了多少。

    您建议的标题对我来说听起来不错:魔数(Magic Number),然后是格式的版本号。我将魔数(Magic Number)和版本号结合起来(不同的版本会产生不同的魔数(Magic Number))。使用 XTS,不需要 IV。盐,我会用很多,例如 8 个字节。我还存储了哈希迭代来哈希密码,我使用 PBKDF2为了那个原因。我认为使用 PBKDF2 之类的东西很重要。

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

    对于 API,使用 ByteBufferbyte[] 都可以。使用ByteBuffer,支持内存映射文件变得更简单。

    关于java - 在Java中正确处理自己的文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31813845/

    相关文章:

    java - 错误 : "Class names are only accepted if annotation processing is explicitly requested"

    java - 将值设置为枚举 - Java

    android - 有什么办法可以改变底部方向向左或向右

    javascript - 使用 Puppeteer 保存网页抓取密码的最安全方法是什么?

    algorithm - 在不泄露来源的情况下比较 secret 数据

    java - Apache CXF 无法发送由 : java.net.SocketException 引起的消息:连接重置

    java同步和共享表

    android - 如果我的套接字已连接但未关闭,为什么我要发送 RST?

    java - 在android上使用SQLITE出现列约束错误

    php - 哪一个更好?使用您自己的加密算法还是使用 md5/sha1?