-2

我正在使用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 中转储)以在以后解密数据?

我错过了这个看似愚蠢但至关重要的联系:以后如何再次检索先前生成的密钥?

4

1 回答 1

0

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

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

于 2020-08-26T13:39:35.930 回答