Security 通过使用RSA加密授权哈希来保护HMAC共享机密

Security 通过使用RSA加密授权哈希来保护HMAC共享机密,security,encryption,hash,hmac,hmacsha1,Security,Encryption,Hash,Hmac,Hmacsha1,我正在考虑构建一个使用HMAC的API系统。服务器和客户端将共享一个秘密,客户端将对请求进行签名,服务器将进行验证,如果一切正常,则继续。这种系统的问题在于,秘密必须以可以检索的方式存储,例如数据库。如果有人要窃取这个秘密,他们就拥有所需的密钥,基本上可以做用户有权做的任何事情 我在想,必须有一个更安全的替代方案。使用RSA有什么缺陷吗 客户端具有“公共”密钥,而不是共享密钥。(对于我的用例,公钥仍然必须保密。) 客户端将使用SHA-1或任何正常的方式散列消息 与直接将散列添加到消息中不同,散列

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

我在想,必须有一个更安全的替代方案。使用RSA有什么缺陷吗

  • 客户端具有“公共”密钥,而不是共享密钥。(对于我的用例,公钥仍然必须保密。)
  • 客户端将使用SHA-1或任何正常的方式散列消息
  • 与直接将散列添加到消息中不同,散列将通过其公钥进行加密,然后与消息一起发送
  • 服务器具有“私钥”(用于解密消息),但不知道“公钥”。(这是使此方法比正常方法更安全的部分。如果数据库被盗,则不会被盗任何可以模拟用户的密钥。)
  • 服务器将解密散列并正常验证消息

  • 这种方法有什么问题吗?有这种或类似的已知实现吗?

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

    (EC)迪菲·赫尔曼:它不起作用。Publickey通过生成器直接从privatekey派生,例如[d]g=Q


    RSA:通常人们会选择像0x010001这样的固定公钥。这样做是为了提高效率。如果你取一个足够大的、完全随机的
    e
    并从中导出
    d
    ,就不可能计算
    p
    q
    给定的
    d
    N
    e
    N
    。事实上,他们当时是相当平等的,私人和公共的标签已经没有多大意义了。所有这些都依赖于RSA的smmyetrical属性。确保不要涉及教科书上的RSA问题。一定要问足够多的聪明人,这只是我的想法。

    如果你的密码系统基于拥有秘密的证据,那么你需要保密:)

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


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

    对于堆栈溢出,这个问题有点离题。你考虑过把它寄到或吗?(显然,如果有的话,检查他们的帮助中心,看看哪一个更合适)。您需要提供有关您的安全目标/威胁的更多信息,以便其他人可以分析您提出的解决方案是否满足这些目标。很可能这个问题以前已经得到了妥善解决,所以我怀疑你是否应该发明自己的方案。我投票将这个问题作为离题题来结束,因为它是关于安全/密码学的,不包含编程问题。@Duncan是的,我的目标不是发明自己的方案,这就是为什么当我想到它时,我应该看看它有什么问题,或者是否存在现有的实现。我考虑过把它贴在上面,但我认为堆栈溢出也是一个不错的地方,因为这里还有很多其他类似的问题。我认为这两个问题都很重要。我猜你指的是“密钥对的一部分”,而不是“公钥”或“公钥密码系统的密钥”。@eckes是的,没错。我在这里说的是公钥/私钥,但在我的用例中,这两个密钥都是保密的,但不是共享密钥。0x010001不是公钥,而是(公共)指数之一。