gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:45 24 4
gpt4 key购买 nike

我必须为 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com