首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HSM解密+加密链

HSM解密+加密链
EN

Stack Overflow用户
提问于 2019-07-30 14:10:46
回答 1查看 946关注 0票数 3

我的应用程序充当了在两方之间传输非常敏感的消息的总机,我正在试图弄清楚如何才能做到这一点,而不是“查看”他们试图发送的消息。

我有一个HSM,我已经为发送者生成了一个密钥对-他们将使用我提供给他们的公钥加密消息,而我可以使用HSM中的私钥解密消息。

然后,我将通过使用最终接收者的公钥来加密该消息。

有没有办法在HSM中链接这两个操作,而不将解密的消息放在我的应用程序内存附近?我希望明文内容永远不会离开HSM的边界。

我知道一些HSM有一个CodeSafe / SEE机器功能,可以让我编写嵌入式系统代码并在HSM中运行它,在我开始之前,我想看看是否有一种方法可以使用通用的PKCS / JCE / CNG API来安全地做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-03 06:06:45

如果您只需要在不同的密钥下重新加密相同的密钥,则可以使用C_Unwrap创建具有转换后的密钥的值的临时HSM对象,然后使用C_Wrap为所有收件人加密此临时HSM对象的值。

这样,秘密将永远不会离开HSM。

类似这样的东西(验证是在带有RSA-OAEP的SafeNet露娜7上工作):

代码语言:javascript
复制
// Your private key for 'decrypting' secret. Must have key unwrapping allowed
CK_OBJECT_HANDLE hsmPrivateKey = ... ;

// Encrypted secret
byte[] wrappedKey = ... ; // 

// Template for temporal generic secret key with value of the secret
CK_ATTRIBUTE[] tempTemplate = new CK_ATTRIBUTE[] {
        new CK_ATTRIBUTE(CKA.CLASS, CKO.SECRET_KEY),
        new CK_ATTRIBUTE(CKA.KEY_TYPE, CKK.GENERIC_SECRET),
        new CK_ATTRIBUTE(CKA.TOKEN, false),
        new CK_ATTRIBUTE(CKA.PRIVATE, true),
        new CK_ATTRIBUTE(CKA.EXTRACTABLE, true),
        new CK_ATTRIBUTE(CKA.SENSITIVE, true),
        new CK_ATTRIBUTE(CKA.ENCRYPT, false),
        new CK_ATTRIBUTE(CKA.DECRYPT, false),
        new CK_ATTRIBUTE(CKA.WRAP, false),
        new CK_ATTRIBUTE(CKA.UNWRAP, false),
        new CK_ATTRIBUTE(CKA.SIGN, false),
        new CK_ATTRIBUTE(CKA.VERIFY, false),
        new CK_ATTRIBUTE(CKA.DERIVE, false)
};

// Unwrapping/decryption mechanism
CK_MECHANISM mechanism = ... ;

// Handle for temporal generic secret key with value of the secret
CK_OBJECT_HANDLE temporalValueHandle = new CK_OBJECT_HANDLE();

// Unwrap/decrypt the secret into temporal key
CryptokiEx.C_UnwrapKey(session, mechanism, hsmPrivateKey, wrappedKey, wrappedKey.length, tempTemplate, tempTemplate.length, temporalValueHandle);

// Wrap/encrypt the secret for recipients. Recipient public keys must have key wrapping allowed
for(CK_OBJECT_HANDLE recipientPublicKey : ... ) {
    LongRef resSize = new LongRef(0);
    CryptokiEx.C_WrapKey(session, mechanism, recipientPublicKey, temporalValueHandle, null, resSize);
    byte[] rewrappedKey = new byte[CryptokiUtils.safeIntCast(resSize.value)];
    CryptokiEx.C_WrapKey(session, mechanism, recipientPublicKey, temporalValueHandle, rewrappedKey, resSize);
    System.out.println("Re-wrapped key: " + bytesToHexString(rewrappedKey));
}

// Delete temporal generic secret key
CryptokiEx.C_DestroyObject(session, temporalValueHandle);

祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57265305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档