PKCS#12使用其他标准的构建块。
推荐的加密模式基于来自PKCS#5(PBES2)的基于密码的加密。在PKCS#5 v.2.1支持SHA-2和AES的情况下,这已经得到扩展。
当OpenSSL的使用AES它这样的:
使用PKCS时
684 30 806: SEQUENCE {
688 30 802: SEQUENCE {
692 06 11: OBJECT IDENTIFIER
: pkcs-12-pkcs-8ShroudedKeyBag (1 2 840 113549 1 12 10 1 2)
705 A0 723: [0] {
709 30 719: SEQUENCE {
713 30 73: SEQUENCE {
715 06 9: OBJECT IDENTIFIER
: pkcs5PBES2 (1 2 840 113549 1 5 13)
726 30 60: SEQUENCE {
728 30 27: SEQUENCE {
730 06 9: OBJECT IDENTIFIER
: pkcs5PBKDF2 (1 2 840 113549 1
5 12)
741 30 14: SEQUENCE {
743 04 8: OCTET STRING
: BA 6B 5B B3 47 27 C9 73
753 02 2: INTEGER 2048
: }
: }
757 30 29: SEQUENCE {
759 06 9: OBJECT IDENTIFIER
: aes128-CBC (2 16 840 1 101 3 4 1 2)
770 04 16: OCTET STRING
: 0F 79 79 0A D3 EC C0 3E 20 B8 51 85 2F 2B 6C 29
: }
: }
: }
据我可以读取源,OpenSSL的编码密码作为ASCII而不是零封端的UTF-16#5 PBES2 。
嗯,不完全是。 PKCS#12使用附录B.2中指定的PBKDF,并且在几个方面与PKCS#5的PBKDF2的PBKDF1不同。例如,与PKCS#5 PBKDF1不同,它具有密钥扩展功能,与PKCS#5 PBKDF2不同,它使用迭代哈希代替HMAC输出的异或总数,不同之处在于它以不同寻常的方式格式化盐和密码。 – 2012-03-09 12:42:25
更具体地说:PKCS#12附录B.1指定应将密码视为BMPStrings而不是简单的OctetStrings。这意味着如果在PKCS#12文件的加密算法标识符字段中遇到PKCS#5算法标识符,则不能确定密码是否应该被视为BMPString。因此,处理规则仍然必须从外部指定为明确的。 – 2012-03-09 12:55:33
@HenrickHellström:据我所知,附录B.2中的PBKDF只是为了向后兼容旧的Microsoft格式。如果您阅读第13页上的注释,您会注意到建议使用PKCS#5机制。 – 2012-03-09 13:03:48