为什么多次调用X509Certificate2.Export(Pkcs12)会返回不同的结果?

Pau*_*ell 3 security cryptography certificate x509certificate2 x509certificate

这是一个测试:

var decoded = Convert.FromBase64String(certificateBase64Encoded);
var certificate = new X509Certificate2(decoded, (string)null, X509KeyStorageFlags.Exportable);

var x = Convert.ToBase64String(certificate.Export(X509ContentType.Pkcs12));
var y = Convert.ToBase64String(certificate.Export(X509ContentType.Pkcs12));

Console.WriteLine(x == y);
Run Code Online (Sandbox Code Playgroud)

使用时X509ContentType.Cert,值始终相同,因此控制台打印"True".但是当使用Pkcs12选项时,值总是完全不同.为什么会这样,有没有办法使它们一样?

pou*_*pou 6

即使您提供了空密码,PKCS#12文件(数据)也会被加密,因此每次都会生成一个新的初始化向量(IV)(来自随机数据),因此输出将永远不会相同.因此,从多次调用Export,您将无法使它们相同.

OTOH证书是从证书颁发机构(CA)签名的,如果不破坏签名就无法更改.它们永远是完全相同的.

注意:我不记得,但可能会定义其他随机结构(例如与包相关),PKCS#12规范有点大.