JKS、BKS 和 PKCS12 文件格式

JKS, BKS and PKCS12 file formats

我正在设置一个无头服务器,该服务器使用数据 - JS、CSS、HTML + 密钥库为 Android 构建 Phonegap 混合应用程序 - 由用户。我想进行一些基本的客户端检查,以确保上传的密钥库有效。对于 JKS 文件,我发现我可以通过确保所提供文件的前四个字节是指定 here 的 MAGIC 数字 0xFEEDFEED 来进行基本检查。我意识到这并不能消除用户提供垃圾的可能性,但它确实有助于作为初步的客户端屏幕。我想对 PKCS12 和 BKS 密钥库实施类似的筛选,但一直找不到对这些文件格式的任何解释。如果有人能够提供有关该主题的一些信息,我将不胜感激。

首先,需要考虑两件事:

  • 您的列表中缺少 JCEKS(更安全的 JKS 版本,幻数是 0xCECECECE)。
  • 有两个不兼容的 BKS 版本。 Bouncy Castle 1.47 引入了新版本,完全取代了旧版本。因此,使用 BC 1.47 或更新版本生成的 BKS 密钥库无法使用 BC 1.46 或更早版本读取。在 BC 1.49 中添加了一个新的密钥库类型“BKS-V1”,它与旧格式兼容(参见 BC Release Notes)。

BKS 格式的前 4 个字节以版本号开头,以空字节和 SHA-1 散列(20 个字节)结尾。

PKCS#12 不是那么容易检测到的。您必须将其解析为 ASN.1 结构(参见 RFC 7292):

PFX ::= SEQUENCE {
   version    INTEGER {v3(3)}(v3,...),
   authSafe   ContentInfo,
   macData    MacData OPTIONAL
}

如果文件不能解析为上述ASN.1结构,则不是PKCS#12。

有关 PKCS12 格式的更易于理解的解释 check here