4

我正在为我公司销售的智能卡编写 CSP 库(用于 CryptoAPI)。

我对私钥的 AT_SIGNATURE 密钥类型和 CALG_RSA_SIGN 算法之间的区别有疑问(AT_KEYEXCHANGE 和 CALG_RSA_KEYX 也是如此)。

我知道 MSDN 网站上写的是什么,但是如果在调用 CPGenKey() 函数时指定了 CALG_RSA... 算法中的任何一个,CSP DLL 应该如何工作?我的意思是它应该生成会话 RSA 私钥还是应该生成密钥并将其保存在卡上?或者它可能取决于在 CPAcquireContext() 调用(即 CRYPT_VERIFY_CONTEXT 即)中指定的标志,并且 AT_SIGNATURE 应该定义为“签名的默认算法”,对于我们的卡来说是 RSA?

谢谢

4

1 回答 1

0

这不是我的答案,只是在网上找到了一个很好的解释:

AT_SIGNATURE 密钥 acn 仅用于签署消息。它不能用于包装(导出)会话密钥。AT_KEYEXCHANGE 键可用于两个目的。因此,如果您只想为两者使用 1(一个)密钥对,您肯定需要 AT_KEYEXCHANGE 密钥对。

您还需要了解一些安全隐患 - 以及为什么使用两个密钥比同时使用相同的密钥对更好:

通常你不应该透露你的签名私钥。如果丢失,您只需生成一个新的签名密钥对并从该时间点开始使用它。另一方面,您通常需要备份您的密钥交换密钥,因为没有它,您将来无法解密消息(如果私钥丢失)。但是,备份意味着密钥可能可供其他人使用——他们现在可以签署据称来自你的消息——而你不希望这样。如果您对这两个操作使用不同的密钥对,您可以进行安全签名(您的签名私钥永远不会消失)并且仍然可以备份您的密钥交换密钥。

关于生成这些密钥的另一个注意事项:由于您不希望知道您的签名密钥,因此当您使用 CryptGenKey(AT_SIGNATURE) 生成它时,您永远不应该设置标志 KEY_EXPORTABLE 或 KEY_ARCHIVABLE 并且您可能需要额外的保护并添加 CRYPT_USER_PROTECTED,所以每次签名密钥用于用户知道它。另一方面,当使用 CryptGenKey(AT_KEYEXCHANGE) 生成密钥交换密钥时,您应该立即备份它:设置标志 CRYPT_ARCHIVABLE 并立即导出密钥以进行备份。(这个标志只允许导出一次密钥——在它被创建之后——所以它比通过设置 CRYPT_EXPORTABLE 允许在任何时候导出更安全。)

Laszlo Elteto SafeNet, Inc.

于 2014-07-22T08:11:14.750 回答