使用 HSM 存储 'master keys' - 怎么做?

Using a HSM to store 'master keys' - how?

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

我的目标是存储一个 'master key' (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)
    })
}

如何 'associate' 使用我的程序数据(例如 S3 存储桶或客户)的其中一个密钥? 我如何再次检索相同的密钥(即使我无法将其从 HSM 中转储)以在以后解密数据?

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

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

对于非对称基元,您可以导出 public 密钥并将此对象映射到 customer/user。