当前位置: 首页 > 知识库问答 >
问题:

使用Safenet HSM解包RSA加密AES密钥,Java泄漏解包密钥

融烨磊
2023-03-14

我正在使用Safenet HSM(硬件安全模块)来存储我的加密密钥,并且我正在尝试使用JavaAPI和SunPKCS11解包使用RSA加密的密钥(AES/DES)。我想安全地执行此操作,以便无法从HSM中提取解包的AES/DES密钥(就像RSA私钥值是不可见的)。但是,在解包后,解包密钥的值在HSM之外的密钥对象中是可见的。

这是我的代码:

Key privateKey = keyStore.getKey("MyKeyId", keyStorePassword);

Cipher cipher = Cipher.getInstance("RSA", "SunPKCS11-Safenet");
cipher.init(Cipher.UNWRAP_MODE, privateKey);
Key unwrappedKey = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
// At this point the unwrapped key is visible in the unwrappedKey object!

如何告诉代码不要泄露未包装的密钥?我必须在PKCS11配置文件中添加一些东西吗?我尝试将以下选项添加到配置文件中,但似乎没有帮助:

attributes(*,CKO_SECRET_KEY,*) = {
  CKA_SENSITIVE=true
}

我不确定API是否会在展开过程中显示密钥。如果是这样,我如何将这些密钥安全地导入到HSM中,以便它们无法从HSM中提取?

我试着询问Safenet支持团队,但他们无法回答为什么会发生这种情况。所以,在互联网上进行了大量的尝试和搜索之后,我在这里提出了这个问题。

共有1个答案

郭彬郁
2023-03-14

如果你打开钥匙。。。你拿回钥匙。也就是说,解开钥匙会露出钥匙。如果您要求HSM打开钥匙,则它会按照您的要求进行操作。

如果HSM支持此操作,可能需要导入密钥。关于密钥导入的假设是,HSM了解为安全/保护/传输而包装密钥的格式。

然后,它将为您执行展开,并将展开的密钥保存在其数据库中。然后,它可能会将钥匙作为手柄或不同包装的钥匙(即使用其内部主钥匙包装)交还给您。

在可比较的HSM之间移动键是导出/导入或备份/还原,具体取决于设备和设备对这些动词的理解。

在不同供应商的HSM或不同的密码系统之间移动密钥,而不暴露秘密是一个有趣的练习。

 类似资料:
  • 这是我的密码 抱歉,如果我的代码一团糟。

  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

  • 但这总是给我以下的例外- 我的键盘生成逻辑- 我的加密逻辑- Base64 Util方法-

  • 我正在尝试将我的应用程序从128位AES密钥升级为256位AES。然而,当我将第54行从128更改为256时,我会得到以下密钥大小错误。 java.security.无效密钥异常: 非法的密钥大小 我已正确安装了JCE文件,我的应用程序生成较长的密钥这一事实证明了这一点。 我在其他文章中看到过“AES / CBC / PKCS7Padding”加密方法,但这只会让我遇到这个例外:

  • 在一个做其他事情的大型应用程序中——我需要加密和解密一个文件。所以我一直在四处寻找,并实现了这两个核心功能,基本上使用RSA密钥包装一个随机的AES密钥来加密一个文件。对称键和iv被写入文件的开头。 我在下面的解密函数部分得到一个异常(“javax.crypto.BadPaddingException:Decryption error”)。在肯安迪夫线路上——doFinal。具体来说,这一行是异常

  • 问题内容: 我需要用openssl生成的和密钥替换从Unix到Java代码的加密和解密步骤 我生成密钥 我在Unix中使用键(我需要在Java中执行) 这是我的尝试 但它不起作用,PKCS8EncodedKeySpec / X509EncodedKeySpec不正确…但是我不知道该放什么 问题答案: 我认为您在读取PEM文件时遇到问题。JPA不直接支持PEM格式。您有两种选择,要么将它们转换为DE