- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: When should [assembly: InternalsVisibleTo()] be used?
问题与微服务有关,当我有多个微服务提供将被订购和计费的功能/服务时。 我正在确定采用哪种方法, a) 每个可计费微服务有一个订单和一个计费服务,有各自的数据库。b) 跨所有微服务的通用订单管理和计费服
我正在尝试使用 gcloud图书馆。 (ns firengine.state (:import [com.google.cloud AuthCredentials] [com.goog
Java 允许定义以下一对类。 class Class1 { ... } public Class2 { public Class2(Class1 c1) { ... } } 如果因为 Class1
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
好吧,这是一个满口的标题。不过,这让我明白了。这是我的代码的要点,在 jar 里: public class NetworkShared { public static class Login
我在使用 ltree 时遇到 PHP 问题来自 PostgreSQL .我在 SQL 中这样做: SELECT * FROM tabla t WHERE t.parent_path " for "OP
我知道如何为类/接口(interface)/包的子集生成 Javadoc。但是有没有办法只为公共(public)方法的一个子集生成 Javadoc? 我更喜欢能够将方法(Javadoc 标记或注释)标
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: c#: why have empty get set properties instead of usin
在我们的每个项目中,都有一个文件用于存储该项目中使用的各种SQL 语句。类的声明方式和字符串的声明方式有一些变化。 示例类声明: internal sealed class ClassName int
我根据 http://docs.jquery.com/Plugins/Authoring 定义了我的插件 (function( $ ){ var methods = { init : fu
我正在使用 Inno Setup 来构建我的安装程序,我有 C:\Users\Public文件夹硬编码在我的 [Files] 中放置一些文件的部分(Inno Setup 没有此文件夹的常量) 我的目标
我有一个 dataframe1 包含像 'ID', 'A', 'B', 'C', 'D', 'E', 'F', 'G' 这样的列. 现在,我创建了两个数据框, dataframe2 包含 'ID',
我有一个抽象类,不幸的是我无法更改它的定义,它基本上提供了一个抽象方法,有点像。 public abstract void do(Data someData, BaseInterface interf
我刚刚在重构时偶然发现了一段奇怪的代码。它看起来像是分解出两个 readString() 方法的共同部分的候选者,只是它似乎是不可能的(这对我来说是一个令人毛骨悚然的脑筋急转弯): private f
是否有解析为公用文件夹的属性?显然,我不想在目录结构中对“c:\users\public”进行硬编码,但我找不到预定义的 Property解决这个问题。是否有一种可接受的方式来指定要在此处安装和/或在
我试图将值从一个类传递到另一个类。 subPanel1 类读取全局变量,但当我通过调整监听器更新这些变量时,它不会更改值。我试图将 rc、gc 和 bc 变量从 subPanel2 类传递到 subP
我想使用具有自动属性的干净且编码较少的类。所有属性(property)都是公共(public)的。在同一类的方法中我也使用了该属性。因此,我认为这种方法是可混搭的,因为我将公共(public)属性用于
不久前,我在 Android 应用程序中创建了一个 SQLiteHelper 类。我不是 100% 确定原因,但表名和列名是嵌套公共(public)静态抽象类中的公共(public)静态最终字段。我记
这个问题已经有答案了: Cannot make a static reference to the non-static method (8 个回答) 已关闭 3 年前。 我正在为类(class)做一
我是一名优秀的程序员,十分优秀!