关于Microsoft CryptoAPI的基本问题

时间:2009-09-22 16:57:15

标签: security cryptography cryptoapi mscapi

我一直在寻找MSDN,试图了解crytoapi。以下是关于事情如何运作的一些问题和猜测。任何答案或确认或反驳我的猜测都非常赞赏。

根据我在http://msdn.microsoft.com/en-us/library/ms867086.aspx找到的说明,CSP在会话之间保留公共私钥对。

* Does that mean they are kept indefinitely? If so, whatever signature or exchange key pairs are extant when the CSP is closed remain. 
* Of what value are these containers and any key pairs they contain?  I guess they could be used to sign things without obtaining a handle to a key pair. 
* Is there any way to get a handle to one of the key pairs?

在我看来,密钥容器可以包含:

* 1 signature key pair
* 1 key exchange key pair
* any number of PUBLIC keys of either signature or key_exchange type
* any number of session keys

这是对的吗?当容器关闭时,非配对密钥是否被破坏?

创建/命名密钥容器的常用方法是什么?如何避免踩踏其他应用程序容器?我需要一个带有公钥/私钥的容器,因此cryptacquirecontext的备注部分中提到的临时容器不适用。 也许使用由一些固定部分和序列号组成的创建名称。完成后可以删除容器。

cryptsignhash指定使用签名或密钥交换私钥来对哈希进行签名。我想这意味着cryptsignkey将找到cryptkeygen使用适当的Alg_id参数创建的私钥(值CALG_RSA_KEYX或CALG_RSA_SIGN)。

如果我导出一个密钥,那么keyblob是否包含告诉它是什么类型密钥的信息?

如果我导出PUBLICKEYBLOB并将其传输到其他环境。在我可以使用它验证签名之前,是否必须在新环境中导入该blob? cryptverifysignature需要一个键的句柄,所以它看起来必须首先导入。导入PUBLICKEYBLOB会替换现有公钥/私钥对的公钥吗?我假设没有。

1 个答案:

答案 0 :(得分:4)

这是很多问题。让我试着回答一下:

  

CSP保留公钥私钥对   会议之间。   这是否意味着他们无限期地保留下来?

是的,直到通过使用CRYPT_DELETEKEYSET标志调用CryptAcquireContext显式删除它们。

  

这些容器和它们包含的任何密钥对的价值是什么?

它们是您可以重用的持久性密钥。如果您在私钥上获得证书,则需要保留私钥 - 如果可以避免,则不希望导出私钥:CSP可以比您更好地保护密钥。

  

有没有办法获得其中一个密钥对的处理?

CryptAcquireContext后跟CryptGetUserKey。

  

它看起来好像是一个钥匙容器   可以包含:1个签名密钥对,1个密钥交换密钥对,任意数量的签名或key_exchange类型的PUBLIC密钥,任意数量的会话密钥。这是对的吗?

是和否。导入的公钥和会话密钥在逻辑上不在任何特定的密钥容器中。

  

是不配对的   密钥在容器被破坏时被破坏   闭合?

  

通常的方法是什么?   创建/命名密钥容器?怎么样   一个人不会踩到某些人   其他应用容器?

大多数应用程序都使用GUID。

  

这意味着cryptsignkey会   找到创建的私钥   cryptkeygen与适当的   Alg_id参数(值CALG_RSA_KEYX   或CALG_RSA_SIGN)。

  

如果我导出一个密钥,那么就是keyblob   包含说明什么样的信息   关键是什么?

这取决于所选的blob类型,但大多数keyblobs都以包含密​​钥类型的BLOBHEADER开头。

  

如果我导出PUBLICKEYBLOB和   将它运送到其他人   环境。我必须导入它吗?   我之前在新环境中的blob   可以用它来验证签名吗?

  

导入一个   PUBLICKEYBLOB替换公钥   任何现存的公钥/私钥对?

没有