正如标题所说,我找不到在受密码保护的 *.pfx/PKCS 12 证书中使用加密算法的任何资源。
受密码保护的 *.pfx/PKCS 12 证书中使用了哪种加密算法?
如果您有要检查的特定 .pfx 文件,您可以使用 openssl 确定使用了哪些加密方法:
openssl pkcs12 -info -in cert.pfx -noout
这可能会给你:
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
这要求您知道 .pfx 文件的密码。如果您不知道密码,您仍然可以使用以下方法找到最外层的加密方法:
openssl pkcs12 -info -in cert.pfx -nomacver -noout -passin pass:unknown
例如,这给出:
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
这个特定的证书文件是由 openssl 使用默认参数生成的,它看起来像:
- 使用 40 位 RC2 和 SHA-1 的外部加密层。外部加密层包含证书。
- 使用 3DES 和 SHA-1 的内部加密层。内部加密层包含私钥。
我认为这是不安全的,因为攻击者可以用简单的暴力破解最外层的加密(40 位加密加上 RC2 有各种漏洞),然后在内部加密层使用相同的密码。然而,这可能需要额外的调查。
Mike Ounsworth 的回答是正确但不完整的。PKCS #12指定了一种容器格式,但它也指定了一些自己的算法集:
PKCS #5 中定义的 PBES1 加密方案提供了许多用于派生密钥和 IV 的算法标识符;在这里,我们指定了更多,所有这些都使用附录 B.2 和 B.3 中详述的过程来构造密钥(和 IV,如果需要)。正如它们的名称所暗示的那样,下面的所有对象标识符都使用散列函数 SHA-1。pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} pbewithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6}
如果您从上面的引用中注意到,它提到了算法的PKCS #5。PKCS #5 指定了两种算法:PBES1 和 PBES2。
较旧的PBES1算法只是一组算法的列表:
pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1}
pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4}
pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3}
pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6}
pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10}
pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11}
PBES2允许您单独混合和匹配加密和PRF算法(与预定义的算法集相反)。我将在这里列出目录中的相关部分,以便您了解:
B.1. Pseudorandom Functions . . . . . . . . . . . . . . . . . 28
B.1.1. HMAC-SHA-1 . . . . . . . . . . . . . . . . . . . . . 28
B.1.2. HMAC-SHA-2 . . . . . . . . . . . . . . . . . . . . . 29
B.2. Encryption Schemes . . . . . . . . . . . . . . . . . . . 29
B.2.1. DES-CBC-Pad . . . . . . . . . . . . . . . . . . . . . 30
B.2.2. DES-EDE3-CBC-Pad . . . . . . . . . . . . . . . . . . 30
B.2.3. RC2-CBC-Pad . . . . . . . . . . . . . . . . . . . . . 30
B.2.4. RC5-CBC-Pad . . . . . . . . . . . . . . . . . . . . . 31
B.2.5. AES-CBC-Pad . . . . . . . . . . . . . . . . . . . . . 32
回到 PKCS #12,它还为整个文件指定了MAC 算法(不是针对单个条目):
本文档使用一种特殊类型的 MAC,称为 HMAC [11] [20],它可以由各种散列函数中的任何一种构造而成。请注意,[20] 和 [11] 中的规范与 [9] 中的规范有些不同。HMAC 所基于的散列函数在保存 MAC 的 MacData 中标识;对于本标准的这个版本,散列函数可以是以下之一:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 或 SHA-512/256 [ 10]。
PKCS #5中也指定了相同的 MAC 算法:
B.3. Message Authentication Schemes . . . . . . . . . . . . . 33
B.3.1. HMAC-SHA-1 . . . . . . . . . . . . . . . . . . . . . 33
B.3.2. HMAC-SHA-2 . . . . . . . . . . . . . . . . . . . . . 33
最后,正如 Mike Ounsworth 的回答所述,您可以选择任何您想要的算法,即使它不在 PKCS #12 或 PKCS #5 中。但是,它必须有一个OID才能在p12 文件的ASN.1表示中使用。
PKCS#12 格式的所有规范都在RFC7292中定义。
简短的总结是一个.p12文件(我假设也是微软的旧PFX格式,但我从未使用过它们)只是一种容器格式,它指定了这个文件的结构,但没有说明应该输入什么样的数据.
打个非常糟糕的类比,Microsoft Excel.xlsx格式规范指定了 Excel 保存文件的结构,但没有告诉您它允许包含哪些数据或公式;这由您运行的 Excel 版本控制。
如果您要在十六进制编辑器中打开 a .p12,您会发现标题中的一个字段是AlgorithmIdentifier: _____创建.p12记录的程序 A)使用哪种加密算法来加密数据,以及 B)哪个哈希算法是用于将密码变成密钥。据我所知,这里没有明确的清单。创建程序的程序.p12可以使用任何AlgorithmIdentifier它想要的东西,包括组成一个。
例如,如果我正在编写软件来读取和写入受密码保护的.p12文件,我可以设置AlgorithmIdentifier: AES256WithPBKDF2,这很好。但我也可以设置AlgorithmIdentifier: MikesCipherWithCatDoodles,只要另一端的软件知道如何处理它,它仍然可以。
TL;DR: PKCS#12 格式仅指定文件的结构,它没有列出哪些算法是合法的,因此实际使用的加密算法将取决于用于创建.p12文件的软件。
如果您想知道使用哪些算法来保护您的.p12文件,请查看您用于读取/写入它们的软件的文档。
由于这已被删除,为了完整起见:OpenSSL 可以通过几个步骤解析 PKCS12 文件,以查找有关所使用算法的信息,而无需密码。举个例子:
$ openssl req -newkey rsa:1024 -nodes -keyout se152866.key -x509 -subj /CN=example.net -out se152866.crt
$ openssl pkcs12 -export -in se152866.crt -inkey se152866.key -passout pass:sekrit -out se152866.p12
$ openssl asn1parse -inform der -in se152866.p12 -i
0:d=0 hl=4 l=1521 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER :03
7:d=1 hl=4 l=1463 cons: SEQUENCE
11:d=2 hl=2 l= 9 prim: OBJECT :pkcs7-data
22:d=2 hl=4 l=1448 cons: cont [ 0 ]
26:d=3 hl=4 l=1444 prim: OCTET STRING [HEX DUMP]:(long,omitted)
1474:d=1 hl=2 l= 49 cons: SEQUENCE
1476:d=2 hl=2 l= 33 cons: SEQUENCE
1478:d=3 hl=2 l= 9 cons: SEQUENCE
1480:d=4 hl=2 l= 5 prim: OBJECT :sha1
1487:d=4 hl=2 l= 0 prim: NULL
1489:d=3 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:8B3C863D73B51E41CADC9272E1696740B885E69E
1511:d=2 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:5992FE887D9EA8A3
1521:d=2 hl=2 l= 2 prim: INTEGER :0800
将此与PKCS12 sec 4 和 4.1 中外部 PFX 的 ASN.1 进行比较,我们看到“authSafe”在偏移量 26 处的 OCTET STRING 项的值中编码,标头长度 (hl) 4 给出 30。忽略 (PB )MAC并查看:
$ openssl asn1parse -inform der -in se152866.p12 -i -strparse 30
0:d=0 hl=4 l=1440 cons: SEQUENCE
4:d=1 hl=4 l= 671 cons: SEQUENCE
8:d=2 hl=2 l= 9 prim: OBJECT :pkcs7-encryptedData
19:d=2 hl=4 l= 656 cons: cont [ 0 ]
23:d=3 hl=4 l= 652 cons: SEQUENCE
27:d=4 hl=2 l= 1 prim: INTEGER :00
30:d=4 hl=4 l= 645 cons: SEQUENCE
34:d=5 hl=2 l= 9 prim: OBJECT :pkcs7-data
45:d=5 hl=2 l= 28 cons: SEQUENCE
47:d=6 hl=2 l= 10 prim: OBJECT :pbeWithSHA1And40BitRC2-CBC
59:d=6 hl=2 l= 14 cons: SEQUENCE
61:d=7 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:2333FBA5F3B3DCC8
71:d=7 hl=2 l= 2 prim: INTEGER :0800
75:d=5 hl=4 l= 600 prim: cont [ 0 ]
679:d=1 hl=4 l= 761 cons: SEQUENCE
683:d=2 hl=2 l= 9 prim: OBJECT :pkcs7-data
694:d=2 hl=4 l= 746 cons: cont [ 0 ]
698:d=3 hl=4 l= 742 prim: OCTET STRING [HEX DUMP]:(long,omitted)
我们看到两个 ContentInfo - 一个位于 authSafe 中的偏移量 4(文件中的 34),它使用 pbeWithSHA1And40BitRC2-CBC 和所示的 salt 和 2048 次迭代进行密码加密,一个位于偏移量 679 (709),在此级别未加密. 我们必须解密第一个以明确确定其类型,但我碰巧知道 pbe-RC2-40 始终用于 certbags,而且它恰好是我的(示例)证书的正确大小。对于第二个,我们可以在另一个级别的 702 (732) 解码其内容部分以获得SafeBag 的 SEQUENCE:
$ openssl asn1parse -inform der -in se152866.p12 -i -strparse 732
0:d=0 hl=4 l= 738 cons: SEQUENCE
4:d=1 hl=4 l= 734 cons: SEQUENCE
8:d=2 hl=2 l= 11 prim: OBJECT :pkcs8ShroudedKeyBag
21:d=2 hl=4 l= 678 cons: cont [ 0 ]
25:d=3 hl=4 l= 674 cons: SEQUENCE
29:d=4 hl=2 l= 28 cons: SEQUENCE
31:d=5 hl=2 l= 10 prim: OBJECT :pbeWithSHA1And3-KeyTripleDES-CBC
43:d=5 hl=2 l= 14 cons: SEQUENCE
45:d=6 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:F75E440A3D7429C7
55:d=6 hl=2 l= 2 prim: INTEGER :0800
59:d=4 hl=4 l= 640 prim: OCTET STRING [HEX DUMP]:(long,omitted)
703:d=2 hl=2 l= 37 cons: SET
705:d=3 hl=2 l= 35 cons: SEQUENCE
707:d=4 hl=2 l= 9 prim: OBJECT :localKeyID
718:d=4 hl=2 l= 22 cons: SET
720:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:644ED94520BF6A45B81C70F73AE2143DE123A620
我们可以看到是一个 pkcs8ShroudedKeyBag,它又是一个来自 PKCS8 的 EncryptedPrivateKeyInfo,包含用 pbeWithSHA1And3-KeyTripleDES-CBC 加密的私钥和所示的 salt 和 2048 次迭代,加上一个 PKCS12Attribute,localKeyID。