使用HSM存储“主密钥”-如何?

问题描述

我正在使用softHSM(带有go库https://github.com/ThalesIgnite/crypto11的FWIW,此处https://pkg.go.dev/github.com/ThalesIgnite/crypto11?tab=doc的文档)。

我的目标是存储“主密钥”(AES256),用于加密对象,类似于AWS S3在HSM设备中所做的操作(因为它更安全)。从该密钥中,只需导出我需要加密对象(或解密对象)的任何其他密钥。

我无法理解稍后如何通过同一软件程序检索HSM中生成的密钥。我看到API提到了context

改写:当我像这样在HSM中生成密钥时:

func TestFindingAllKeys(t *testing.T) {
    withContext(t,func(ctx *Context) {
        for i := 0; i < 10; i++ {
            id := randomBytes()
            key,err := ctx.GenerateSecretKey(id,128,CipherAES)
            require.NoError(t,err)

            defer func(k *SecretKey) { _ = k.Delete() }(key)
        }

        keys,err := ctx.FindAllKeys()
        require.NoError(t,err)
        require.NotNil(t,keys)

        require.Len(t,keys,10)
    })
}

如何将这些秘密密钥之一与程序数据(例如S3存储桶或客户)相关联? 如何再次检索相同的密钥(即使我无法将其转出HSM)也可以在以后解密数据?

我缺少这种看似愚蠢但至关重要的联系:在以后的某个时间如何再次检索以前生成的秘密密钥?

解决方法

您可以使用pkcs#11令牌标签,或等效于标签对称密钥的标签。 您还可以使用插槽概念,保留将用户/客户映射到密钥的本地数据库。

对于非对称基元,您可以导出公钥并将此对象映射到客户/用户。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...