RS256 vs HS256:有什么区别?

我正在使用Auth0来处理我的Web应用程序中的身份validation。 我正在使用ASP.NET Core v1.0.0和Angular 2 rc5,而且我对通常的身份validation/安全性知之甚less。

在用于ASP.NET Core Web Api的Auth0文档中,对于 RS256和HS256,JWTalgorithm有两种select。 这可能是一个愚蠢的问题,但是:

RS256和HS256有什么区别? 什么是用例(如果适用)?

两种select都是指身份提供者使用什么algorithm来签署 JWT。 签名是一种encryption操作,它生成令牌接收者可以validation的“签名”(JWT的一部分),以确保令牌没有被篡改。

  • RS256(带有SHA-256的 RSA签名)是一种非对称algorithm ,它使用公钥/私钥对:身份提供者具有用于生成签名的私钥(秘密),并且JWT的用户获得公钥validation签名。 由于公钥与私钥相对,不需要保证安全,因此大多数身份提供者可以轻松地让消费者获取和使用(通常通过元数据URL)。

  • 另一方面,HS256(带有SHA-256的HMAC )是一种对称algorithm ,只有一个(秘密)密钥在双方之间共享。 由于使用相同的密钥来生成签名并对其进行validation,所以必须小心确保密钥不被损害。

如果您将开发使用JWT的应用程序,则可以安全地使用HS256,因为您可以控制谁使用密钥。 另一方面,如果你不能控制客户端,或者你没有办法保护密钥,RS256将会更加适合,因为消费者只需要知道公共(共享)密钥。

由于通常可以从元数据terminal获得公钥,所以客户端可以被编程为自动检索公钥。 如果是这种情况(就像使用.Net核心库一样),那么在configuration(库将从服务器获取公钥)上的工作量就会减less。 另一方面,对称密钥需要在带外交换(确保安全的通信信道),并且如果存在签名密钥翻转,则手动更新。

Auth0提供OIDC,SAML和WS-Fed协议的元数据端点,可以检索公钥。 您可以在客户端的“高级设置”下看到这些端点。

例如,OIDC元数据端点的格式为https://{account domain}/.well-known/openid-configuration /。well-known https://{account domain}/.well-known/openid-configuration 。 如果浏览到该URL,则会看到一个引用https://{account domain}/.well-known/jwks.json的JSON对象,其中包含帐户的公钥(或多个关键字)。

如果你看看RS256的样本,你会发现你不需要在任何地方configuration公钥,它是由框架自动检索的。

在密码学中有两种types的algorithm:

对称algorithm

一个密钥用于encryption数据。 使用密钥进行encryption时,可以使用相同的密钥对数据进行解密。 例如,如果Mary使用密钥“my-secret”encryption消息并将其发送给Jon,则他将能够使用相同的密钥“my-secret”正确解密消息。

不对称algorithm

两个密钥用于encryption和解密消息。 当一个密钥(public)用于encryption消息时,另一个密钥(private)只能用于解密。 因此,Jhon可以生成公钥和私钥,然后只发送公钥给玛丽encryption她的信息。 该消息只能使用私钥解密。

HS256和RS256情景

这些algorithm不用于encryption/解密数据。 而是用来validation数据的来源或真实性。 当Mary需要向Jhon发送一个公开消息,并且他需要确认消息确实来自Mary时,可以使用HS256或RS256。

HS256可以使用一个密钥为给定的数据样本创build一个签名。 当消息与签名一起传输时,接收方可以使用相同的密钥来validation签名是否与消息匹配。

RS256使用一对钥匙来做同样的事情。 签名只能使用私钥生成。 并且必须使用公钥来validation签名。 在这种情况下,即使Jack发现了公钥,他也不能用签名来伪造Mary。