我正在使用Safenet HSM(硬件安全模块)来存储我的加密密钥,并且我试图使用Java API和SunPKCS11解开用RSA加密的秘密密钥(AES / DES)。我想安全地执行此操作,以使无法从HSM中提取未包装的AES / DES密钥(例如RSA私钥值不可见)。但是,解开密钥后,在HSM外部的密钥对象中可以看到已解密钥的值。
这是我的代码:
msg.complete
我怎样才能告诉代码不要公开解包的密钥?我是否必须在PKCS11配置文件中添加一些内容?我尝试将以下选项添加到配置文件中,但似乎无济于事:
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!
我不确定API是否应该在解包期间显示密钥。如果是这样,我如何才能将此类密钥安全地导入到HSM中,以使它们无法从中提取出来?
我曾尝试向Safenet支持团队咨询,但他们无法回答为什么会这样。因此,经过大量尝试和搜索Internet,我在这里提出了这个问题。
答案 0 :(得分:0)
如果解开密钥...,您将取回密钥。即,展开密钥会暴露密钥。如果您要求HSM拆开密钥,则它正在执行您要求的操作。
如果HSM支持此操作,也许您想改为 import 密钥。密钥导入的假设是,HSM理解为安全/保护/传输而包装密钥的格式。
然后它将为您进行解包,并将解包的密钥保存在其数据库中。也许然后它会将您作为 handle 或不同包装的密钥(即,使用其内部主密钥进行包装)交给您。
在类似的HSM之间移动键是导出/导入或备份/还原,具体取决于设备和设备对这些动词的理解。
在不同供应商的HSM或不同密码系统之间移动密钥,而不公开秘密是一项有趣的练习。