通过使用 RSA 加密授权散列来保护 HMAC 共享机密

Secure HMAC shared secret by encrypting authorization hash with RSA

我正在考虑构建一个使用 HMAC 的 API 系统。服务器和客户端将有一个共享的秘密,客户端将签署请求,服务器将验证,如果一切顺利则继续。这种系统的问题在于秘密必须以可以检索的方式存储,例如数据库。如果有人要窃取秘密,他们就拥有执行用户被授权执行的基本上任何操作所需的密钥。

我在想一定有更安全的选择。使用 RSA 有什么缺陷吗?

  1. 客户端有 "public" 密钥而不是共享密钥。 (对于我的用例,public 密钥仍必须保密。)
  2. 客户端将使用 SHA-1 或其他任何方式对消息进行哈希处理。
  3. 不是直接将散列添加到消息中,而是通过它的 public 密钥对散列进行加密,然后与消息一起发送。
  4. 服务器有 "private" 密钥(用于解密消息)但不知道 "public" 密钥。 (这是使它比普通方法更安全的部分。如果数据库被盗,则不会窃取可以冒充用户的密钥。)
  5. 服务器将解密哈希并正常验证消息。

这种做法有什么问题吗?是否有此或类似的已知实现?

这取决于您选择的非对称密码系统:

(EC)Diffie-Hellman: 它不起作用。公钥是通过生成器直接从私钥派生的,例如[d]G = Q

RSA: 通常人们会选择固定的 public 密钥,例如 0x010001。这样做是出于效率原因。如果你取一个足够大的、完全随机的 e 并从中导出 d 则不可能计算 pq 给定 d 和 [=15] =] eN。实际上,那时它们几乎是一样的,标签 private 和 public 不再有意义了。所有这些都依赖于 RSA 的 smmyetrical 属性。一定不要走进教科书 RSA 问题。一定要问问足够聪明的人,这只是我的想法。

如果您的加密系统基于拥有您需要的秘密的证明,那么 - 保守秘密 :)

但是,是的,如果您不需要对称身份验证的速度,那么您可以使用非对称签名。通常它是使用签名哈希完成的,但您也可以使用签名 hmac。

术语通常是,您使用密钥签名并使用 public 密钥验证(即使签名操作看起来像加密)。