有关 Microsoft CryptoAPI 的基本问题
-
13-09-2019 - |
题
我一直在浏览 MSDN 试图理解 cryptoapi。以下是一些关于事情如何运作的问题和猜测。非常感谢任何答案或确认或反驳我的猜测。
根据我发现的注释 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)创建的私钥。
如果我导出密钥,密钥块是否包含表明密钥类型的信息?
如果我导出 PUBLICKEYBLOB 并将其传输到其他环境。我是否必须先将该 blob 导入到新环境中,然后才能使用它来验证签名?cryptverifysignature 需要密钥的句柄,因此看起来必须首先导入它。导入 PUBLICKEYBLOB 是否会替换任何现有公钥/私钥对的公钥?我认为不是。
解决方案
这是很多问题。让我尝试回答一下他们:
CSP在会话之间保持公共私人密钥对。这是否意味着它们会无限期保留?
是的,直到通过使用 CRYPT_DELETEKEYSET 标志调用 CryptAcquireContext 来显式删除它们。
这些容器及其包含的密钥对有什么价值?
它们是您可以重复使用的持久密钥。如果您获得私钥上的证书,您希望保留私钥 - 并且如果可以避免的话,您不想导出私钥:CSP 可以比您更好地保护密钥。
有什么方法可以获取其中一对密钥的句柄吗?
CryptAcquireContext 后面是 CryptGetUserKey。
在我看来,关键容器可以包含:1 个签名密钥对、1 个密钥交换密钥对、任意数量的签名或 key_exchange 类型的公共密钥、任意数量的会话密钥。它是否正确?
是和不是。导入的公钥和会话密钥逻辑上不在任何特定密钥容器中。
关闭容器时,非配对键是否销毁?
是的。
创建/命名密钥容器的通常方法是什么?如何避免在其他某些应用程序容器上踩踏?
大多数应用程序都使用 GUID。
这意味着CryptSignKey将找到使用适当的Alg_ID Parmeter(值CALG_RSA_KEYX或CALG_RSA_SIGN)创建的CryptKeygen创建的私钥。
是的。
如果我导出一个键,密钥库是否包含信息告诉它是什么样的键?
这取决于所选的 blob 类型,但大多数 keyblob 都以 块头 包含密钥类型。
如果我导出一个publicKeyblob并将其运送到其他环境中。在新环境中,我是否必须在新环境中导入该斑点,然后才能使用它来验证签名?
是的。
导入publicKeyBlob是否替换了任何现有的公共/私钥对的公钥?
不。