加密和数字签名能否生成一个文件?

Can encryption and Digital signatures produce exactly one file?

我正在尝试使用 AES 在 Java 中加密文件,然后对其进行数字签名并将其存储在数据库中,以便我可以验证签名,然后在获取该文件时对其进行解密。我已经阅读了 Oracle 关于数字签名的教程,但他们最终创建了 3 个文件,即:数据、签名和 Public 密钥。我正在寻找一种只能获得一个文件的解决方案。是否存在任何此类解决方案?我是密码学的新手,所以无法收集到太多关于它的信息。

是的:您可以简单地将生成的文件连接成一个文件(使用分隔符以便您可以再次拆分它们)。 或者您可以将它们全部放在一个 zip 文件中,然后在处理前解压缩。

哎呀错过了数据库部分:您可以在那里将信息存储为 ascii 编码的 varchar 或直接将结果文件读入 BLOB

当然可以。如果您只是连接结果(可能通过长度指示器进行处理以使它们分开)那么您已经合成了这样一个可以存储在文件中的单个 blob。

那当然不是一个很好描述的结构。在密码学中,已经定义了执行此操作的结构。除了为 RNCrypt 等库定义的许多结构之外,还有两种众所周知的容器格式:CMS 和 PGP。 CMS 或加密消息语法最初是为 SMIME 描述的,是从 RSA 的 PKCS#7 标准演变而来的。 PGP 和 GPG 等应用程序使用 OpenPGP。

对于 Java,PGP 和 CMS 功能均由 Bouncy Castle 库提供。

这取决于您的情况,但如果满足以下 所有 条件,您只需要 public 密钥签名。你想要:

  1. 运行 不同位置的多个版本的 AES 加密引擎
  2. 然后需要能够验证哪个服务器加密了哪些文件
  3. 同时在检查期间防止中间人攻击

这种情况很少见,我建议您真的不需要 public 调号。

通常您只需附加一个 HMAC "signature" 来验证文件。我称它为签名,因为它是一种签名,因为它使用对称 AES encryption/decryption 密钥和加密文件内容来生成代码。这将保护文件的完整性,防止不知道 encryption/decryption 密钥的人修改。

如果您使用 AES 加密文件,我建议使用下载页面上的免费 open source file format. There is a JAVA library available