问题描述
我正在使用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
令牌标签,或等效于标签对称密钥的标签。
您还可以使用插槽概念,保留将用户/客户映射到密钥的本地数据库。
对于非对称基元,您可以导出公钥并将此对象映射到客户/用户。