使用 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。
我正在使用 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。