【发布时间】:2020-08-25 16:32:12
【问题描述】:
我正在使用 softHSM(带有 go 库的 FWIW https://github.com/ThalesIgnite/crypto11,此处的文档 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 中转储)以解密数据?
我错过了这个看似愚蠢但至关重要的联系:如何在以后再次检索先前生成的密钥?
【问题讨论】:
-
我不知道这个库,但您通常不会从 hsm 中检索密钥。您宁愿将您的数据发送给它,这样它就可以自己执行加密(如加密或解密内容)。这就是重点,永远不要释放密钥,我猜这个也是这样的。
-
@GaborLengyel 我明白了。也许我的任务没有明确说明,他们希望我发送数据以进行加密或解密。无论如何,我的问题仍然存在:如何确保在 HSM 上使用相同的主密钥进行解密?我的意思是你如何对 HSM 进行“身份验证”,以便它每次都使用相同的主密钥??
-
HSM 的使用很大程度上是特定于供应商的;但是通过 PKCS#11 的访问是相当统一的。我的意思是,您的问题可能过于宽泛。
标签: security cryptography pkcs#11 hsm softhsm