【问题标题】:CAPICOM vs P/InvokeCAPICOM 与 P/Invoke
【发布时间】:2011-10-15 04:20:58
【问题描述】:

我想在 C# 中使用 CryptoAPI 来访问证书存储并签署消息。

This MSDN article "CAPICOM: CryptoAPI Made Easy" 显示了两种方法:使用 CAPICOM 或 P/Invoke。

  1. 哪个最好? CAPICOM.dll 或 P/Invoke [DllImport("crypt32.dll", ...)]

  2. “crypt32.dll”是否总是存在于任何机器上?

【问题讨论】:

  • Cobaia,欢迎来到 SO。请将您的问题改写为实际问题。这是一个高质量的问答网站,所以我不想看到你的问题被关闭。
  • 我试图修改措辞。

标签: c# .net cryptography certificate capicom


【解决方案1】:

crypt32's availablility 不应该反对问题,而capicom's 可以。

同样,在前往 p\invoke 之前,您应该确保 .Net 中没有托管包装器

【讨论】:

  • 我必须从证书存储中获取证书,但我只能使用可导出的密钥。所以我将使用 cryptAPI。谢谢
【解决方案2】:

CAPICOM 是一项已被 Microsoft 弃用/正在弃用的旧技术。 P/Invoke (Platform Invoke) 允许托管代码调用在 DLL 中实现的非托管代码。

它是 CryptoAPI 库的基于 COM 的包装器。您发布的文章是 2003 年的文章。那是 8 年前的事了,技术已经在进步。

MSDN 上的这篇文章recommends you use the .NET framework 用于代替 CAPICOM 的安全功能。

【讨论】:

【解决方案3】:

是否需要使用 CAPICOM?它会起作用,但有一些非常烦人的缺点,如果您不/必须/使用它,您最好使用 System.Security.Cryptography。

无论如何:要使用 CAPICOM,您必须首先在项目中添加对它的引用。那么:

    CAPICOM.SignedData signeddata = new CAPICOM.SignedData();
    FileStream file = File.Open(tbSourceFile.Text, FileMode.Open);
    byte[] Content = new byte[(int)file.Length];

    file.Read(Content, 0, (int)file.Length);
    file.Close();

    StringWriter sw = new StringWriter();
    sw.Write(Content);

    signeddata.Content = sw.ToString();

    IStore store = new CAPICOM.Store();
    store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
    ICertificates2 certificates = (ICertificates2)store.Certificates;

    certificates = certificates.Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE, true);

    if (certificates.Count > 0)
    {
        certificates = certificates.Select();
    }
    if (certificates.Count > 0)
    {
        ISigner2 signers = new CAPICOM.Signer();
        signers.Certificate = certificates[1];
        tbSignatureBlock.Text = signeddata.Sign(signers, true);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2013-06-11
    • 2014-05-26
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多