速度(由于我的服务器将需要签名许多令牌,它们如何执行?)
安全性(它们如何抵御暴力攻击)和Rainbow表?这可能与我最关心的问题有关。)
稳定性(这些算法是否被接受为稳定,可靠和可靠的算法?)
#1 楼
区别在于ECDSA解决了HMAC无法解决的问题。如果您需要解决该问题,则需要执行ECDSA而不是HMAC;如果您不这样做,那么HMAC也可以正常工作(并且便宜很多)。使用HMAC,这就是我们所拥有的:我们有一个具有密钥的身份验证器。它接收一条消息,并将其(和密钥)提供给HMAC算法,并生成一个标签。我们将该标签和消息一起发送给验证者。
验证者还具有密钥。它获取接收到的消息,并将其(和密钥)提供给HMAC算法,然后生成标签。然后,它检查计算出的标签是否与接收到的标签完全相同;如果是,则它知道该消息与最初发送时的消息完全相同。
使用ECDSA,这就是我们拥有的。我们有一个具有私钥的身份验证器。它接收一条消息,并将其(和密钥)提供给ECDSA签名算法,并生成一个标签。我们将该标签和消息一起发送给验证者。
验证者还具有公钥(不是验证者的私钥)。它获取接收到的消息和标签,并将其(和公钥)提供给ECDSA验证算法,然后检查标签是否与消息相对应。如果是这样,那么它将知道该消息与最初发送时的消息完全相同。
那么,有什么不同?使用HMAC,双方共享相同的密钥。验证者可以(如果愿意)为自己选择的消息生成自己的标签,这些标签也将进行验证。对于ECDSA,这不会发生。验证者拥有的密钥(公共密钥)允许它检查标签,但不允许它自己生成标签。
那么,这种区别在您的情况下重要吗?我对您要说的话一无所知。您需要回答的问题是:您可以信任验证者不生成自己的令牌吗?您可以信任可以访问验证者密钥的人吗?如果这不是您担心的事情(可能是因为验证程序是唯一关心一组特定键生成的标签的验证程序),则HMAC可以正常工作(而且,正如我之前提到的,它便宜很多)。如果您确实在意(例如,您将验证程序代码分发给很多人,并且您拥有一组密钥),那么HMAC的价格有多低都没关系-它不能解决您的问题-您需要与ECDSA之类的东西
#2 楼
为了增加雨披的答案(因为他们击败了我!),如果可以的话,选择HMAC而不是ECDSA(或RSA)有很多优点:/>性能大为提高:签名和验证快得多
实现起来更简单:这对安全性很重要(即使您不是正在执行的人),因为更多的复杂性会带来更多的机会
更安全:HMAC具有安全性证明,可以假设基础哈希函数的一些基本属性。 HMAC在该领域也表现出色:尽管MD5出现了一些故障,但HMAC-MD5仍然安全。同时,ECDSA要求将其哈希函数与“抗冲突”功能配合使用-要求更高,并且经受时间考验的可能性较小(请注意,带有MD5的ECDSA已损坏,而HMAC-MD5则未损坏)。 ECDSA也可能会因各种数学上的进步而被打破(例如,在解决离散对数问题中)。
也就是说,如果您需要公钥和私钥之间的分隔,则ECDSA是一个不错的选择。
编辑:需要明确的是,HMAC-MD5仍然是安全的,但是HMAC-SHA256是新应用程序的更好选择。
评论
$ \ begingroup $
对于Web应用程序身份验证(JWT),使用HMAC-SHA512是否比使用HMAC-SHA256提供更高的安全性?今天有什么建议?在64位计算机上,HMAC-SHA512的编码/解码是否比HMAC-SHA256更快?
$ \ endgroup $
– W.M.
17年12月9日在17:04
$ \ begingroup $
@ W.M。两者的安全性基本上没有意义,但是SHA-512在某些处理器上的较长消息上通常更快。对于短消息(JWT可能长几个kB),时间差异很小。如果需要,请使用已使用的任何设备,如果完全未使用,请使用SHA-512。
$ \ endgroup $
–尼克T
20-05-26在19:29
评论
仅供参考,规范草案指出,必须实施HMAC SHA-256,而必须实施ECDSA(或RSA)。只是想指出这一点。雨披的答案就在眼前。我认为“已实现”是图书馆/提供商的限定词,但“在您的网站上实现”可能意味着更接近配置,您可能只想使用一个。为了避免JWT安全漏洞,最好严格一点:在组合的auth实现中混合使用对称(HMAC)和非对称(RSA / ECDSA)算法势必会成为灾区。