【问题标题】:Using a HSM to store 'master keys' - how?使用 HSM 存储“主密钥” - 如何?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2022-01-26
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多