【问题标题】:MS CSP: Difference between AT_SIGNATURE and RSA_KEY_SIGN (and also AT_KEYEXCHANGE and CALG_RSA_KEYX)MS CSP:AT_SIGNATURE 和 RSA_KEY_SIGN(以及 AT_KEYEXCHANGE 和 CALG_RSA_KEYX)之间的区别
【发布时间】:2010-08-25 17:39:19
【问题描述】:
我正在为我公司销售的智能卡编写 CSP 库(用于 CryptoAPI)。
我对私钥的 AT_SIGNATURE 密钥类型和 CALG_RSA_SIGN 算法之间的区别有疑问(AT_KEYEXCHANGE 和 CALG_RSA_KEYX 也一样)。
我知道 MSDN 网站上写的是什么,但是如果在调用 CPGenKey() 函数时指定了 CALG_RSA... 算法中的任何一个,CSP DLL 应该如何工作?我的意思是它应该生成会话 RSA 私钥还是应该生成密钥并将其保存在卡上?或者它可能取决于 CPAcquireContext() 调用中指定的标志(即 CRYPT_VERIFY_CONTEXT
谢谢
【问题讨论】:
标签:
windows
cryptography
cryptoapi
rsacryptoserviceprovider
【解决方案1】:
不是我的回答,只是在网上找到了一个good explanation:
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 允许随时导出更安全。)
拉兹洛·埃尔特托
SafeNet, Inc.