Java JCA/JCE和PKCS#11如何(一起)工作?

Java JCA/JCE和PKCS#11如何(一起)工作?,java,jce,pkcs#11,Java,Jce,Pkcs#11,我想使用HSM(硬件安全模块)创建XML文件的签名。我做了一些研究,但现在有点困惑 请澄清这些问题: JCE中的键句柄意味着什么?我读过,它只是一个手柄,钥匙被存放在其他地方。这怎么可能?根据我的理解,我要么将密钥加载到内存并使用它,要么签名完全由HSM完成,我只得到结果,对吗 PKCS#11标准是否定义了在HSM中生成签名的方法?我读过关于代币的书,但我不确定是否需要签名 我的HSM的特性列表分别说明JCE和PKCS#11。这是什么意思 我认为PKCS#11是一个标准,JCE定义了使用该标准的

我想使用HSM(硬件安全模块)创建XML文件的签名。我做了一些研究,但现在有点困惑

请澄清这些问题:

  • JCE中的键句柄意味着什么?我读过,它只是一个手柄,钥匙被存放在其他地方。这怎么可能?根据我的理解,我要么将密钥加载到内存并使用它,要么签名完全由HSM完成,我只得到结果,对吗
  • PKCS#11标准是否定义了在HSM中生成签名的方法?我读过关于代币的书,但我不确定是否需要签名
  • 我的HSM的特性列表分别说明JCE和PKCS#11。这是什么意思
  • 我认为PKCS#11是一个标准,JCE定义了使用该标准的类。JCE是否指定了自己的协议
  • JCE中的键句柄是什么意思?
    密钥句柄(在JCE、PKCS#11或大多数其他加密API中)只是一个引用,使您能够使用密钥而不查看其实际值。这很好:您可以将密钥永久存储在一个安全的地方(例如HSM),并保证没有人能够复制它并将其带走-如果密钥是应用程序空间,则可能会发生这种情况。与物理保险箱不同的是,您仍然可以执行加密操作,而不会出现任何密钥泄漏的安全风险

  • PKCS#11标准是否定义了在HSM中生成签名的方法?
    PKCS#11是用于加密令牌的C API。令牌是PKCS#11抽象,用于提供此类API描述的服务的任何设备或程序。API定义了可以使用PKCS#11令牌内的对象执行的操作:某些对象是非敏感的,可以提取(例如公钥);有些是敏感的,只能通过手柄使用。
    如果您拥有支持签名的对象的句柄,则可以使用C函数要求令牌对应用程序提供的某些数据进行身份验证。钥匙不会离开HSM

  • 我的HSM的功能列表分别列出了JCE和PKCS#11。这是什么意思?
    您的HSM支持JCE,因为它附带了一个本机库,可以作为一个本地库。
    它支持PKCS#11,因为它附带了一个提供C PKCS#11 API的本机库

  • 我认为PKCS#11是一个标准,JCE定义了使用该标准的类。JCE是否指定了自己的协议?
    事实上,PKCS#11是一个标准;但是它不能被C以外的语言直接使用。您需要一个映射层将其转换为与您的语言兼容的内容。PKCS#11库(及其抽象的物理标记)可以映射到


  • 但是,JCE提供商可能与PKCS 11无关。

    您能否提供关于1的更多信息。请我使用的API(XAdES4J,Java)使用
    PrivateKey
    创建签名。这是一把真正的钥匙,还是一个手柄?作为一个用户,我怎么知道呢?(我目前只使用密钥库,所以我不能只调试它)这取决于支持您的
    密钥库的内容。如果是PKCS#11,并且您的提供商是您的HSM,则密钥不会加载到RAM中,而是会留在HSM中。你将只处理它的句柄。我还不清楚这个句柄的主题。假设我的HSM插槽7中存储了一个私钥“abcde”。这给了我一个id为7的句柄。现在我想用这个私钥来创建一个签名。我只看到两个选项:a)获取与句柄7关联的私钥并自己创建签名(这意味着知道秘密“abcde”),或b)将签名内容传输到HSM并告诉其使用插槽7,HSM返回创建的签名。对吗?我遗漏了什么吗?选项b)是正确的方案。如果密钥创建正确,HSM在正常情况下不会释放私钥。