3

Вот тест:Почему несколько вызовов в X509Certificate2.Export (Pkcs12) возвращают разные результаты?

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); 

При вызове с помощью X509ContentType.Cert, значение всегда одинаково, и поэтому консоль печатает «True». Но при использовании опции Pkcs12 значение всегда сильно отличается. Почему это так, и есть ли способ сделать их одинаковыми?

+1

Я думаю, что файлы PKCS12 содержат симметричный ключ; поскольку вы используете перегрузку X509Certificate2.Export, который не принимает пароль для ключа PKCS12, он может генерировать некоторые случайные биты от вашего имени. Вы пытались использовать одну из экспортных перегрузок, которые принимают строку пароля? – beefarino

ответ

6

Файл (данные) PKCS # 12 зашифрован, даже если вы предоставили нулевой пароль, поэтому каждый новый вектор инициализации (IV) будет генерироваться каждый раз (из случайных данных), поэтому вывод никогда не будет таким же. Таким образом, вы не сможете сделать их идентичными, от нескольких вызовов до экспорта.

OTOH сертификаты подписываются из центра сертификации (CA) и не могут быть изменены без нарушения их подписи. Они всегда будут одинаковыми.

Примечание: Я не помню, как это было сделано, но могут быть другие случайные структуры (например, связанные с сумкой), спецификация PKCS # 12 немного велика.

Смежные вопросы