gpt4 book ai didi

security - JWT RS256:通过https获取公共(public) key 是否安全?

转载 作者:行者123 更新时间:2023-12-03 06:30:41 27 4
gpt4 key购买 nike

我正在使用RS256算法对JWT进行签名。为了在客户端上验证那些令牌,我需要以某种方式访问​​公共密钥。

当我设置一个不受保护的API路由('/ api / certificate')以返回包含公钥的证书时,是否存在安全隐患(欺骗,...)。我是否需要进行任何额外的安全措施?

最佳答案

几个概念经常混杂在一起,也许不适合您,但让我尝试解释一下此答案中的一些内容。

对称密码学显然需要一个公共密钥和一个私有密钥,两者基本上都是数字。私钥是保密的,公钥是公共的,任何人都可以拥有。在对内容进行签名时,您可以使用私钥进行签名,然后任何人都可以使用公钥来验证签名是由具有相应私钥的人(即您)进行的。

但是问题是,您如何分配您的公共密钥,或者在您的jwt示例中,客户如何获得它。正如您在问题中正确指出的那样,仅通过不安全的通道下载公钥是不够的,因为攻击者可以用他自己的公钥替换公钥,从而导致攻击者能够签名令牌。

解决此问题的一种方法是按照您的建议通过https进行获取,这实际上意味着使用第二组公共-私有密钥对(Web服务器的密钥)来确保发送第一个密钥对。顺便说一句,理论上的问题还是一样,只是在后台为您解决了固有的问题:浏览器如何知道它在连接时从服务器接收到的公钥实际上属于服务器。它们之间还没有安全通道。

输入证书。

证书实际上是一个将公钥与其所有者绑定在一起的文档,而这正是您想要的。当浏览器连接到网站时,服务器将发送其公用密钥及其证书,以便浏览器可以验证公用密钥实际上属于发送该邮件的服务器(在本例中为域名)。如何验证它超出了本文的范围,关键是该证书是由另一个公钥签名的,该证书可能是由另一个公钥签名的,等等,并且该链以这样的列表终止OS /浏览器供应商已为您的计算机和/或浏览器设置了称为受信任的根证书。

您也应该以相同的方式用证书验证公钥。您甚至不需要为此承担SSL(https)传输的负担,验证公钥是否属于特定主题是证书的主要目的。

因此,您要做的不仅是从API获取公共密钥,还包括将其与证书一起使用。您可能已经在这样做了,很少使用裸露的公共密钥。您很可能已经从服务器收到了pfx或cer或crt或其他内容。根据所开发的技术堆栈,可以确定使用内置机制来完全验证证书并确保证书有效。但是请不要实施自己的验证,因为这是一项棘手的事情,而且很难正确完成。如果证书通过验证,则您可以相信从API收到的公钥是真实的,并且属于它声称属于的任何内容。但是,可能会有一些警告(例如,确保超出基本验证范围,然后检查其他人无法获得的证书中的字段组合)。

作为附加的安全措施,您还可以实施证书固定,以通过在客户端中具有有效证书的指纹列表来使它更安全地抵御某些类型的攻击(在浏览器客户端中较少),但是概念仍然相同)。

编辑(证书通过有效期的一般验证后,要在哪些字段中签入证书等):

在一般情况下,这取决于谁签署了证书以及证书的种类。

由真实证书颁发机构(CA)签名的服务器证书只能将服务器域作为其公用名(CN)字段,真实CA通常不会签署其他任何内容,也不会为您的域签名证书。 com,除非您可以证明自己控制了yourdomain.com。因此,在这种情况下,在证书通过验证后检查CN可能就足够了。不过,您确实需要检查CN,因为任何人都可以从GlobalSign或Thawte或其他受信任的CA获得有效的证书,这只会花费金钱。他们没有的是yourdomain.com的证书。

如果您自己签署证书,那么您也不会为任何人签署任何东西,因此在这种情况下,足以检查发行人(您已签署)和CN(针对谁)。如果该证书另外通过了验证(意味着受信任的根证书已签名),则应该可以,因为攻击者通常无法在您的计算机上将其CA证书视为受信任的。

总的来说,您想检查别人没有的东西。如果您依赖于真实的CA,则比较容易,通常最好检查指纹。

关于security - JWT RS256:通过https获取公共(public) key 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com