个人笔记,不保证正确。

签名算法

介绍具体的 JWT 签名算法前,先解释一下签名、摘要/指纹、加密这几个名词的含义:

数字签名(Digital Signature):就和我们日常办理各种手续时需要在文件上签上自己的名字一样,数字签名的主要用途也是防止伪造签名。

数字摘要(digest)/数字指纹(fingerprint): 指的都是数据的 Hash 值。

加密算法:这个应该不需要解释,就是对数据进行加密。。

数字签名的具体实现,通常是先对数据进行一次 Hash 摘要(SHA1/SHA256/SHA512 等),然后再使用非对称加密算法(RSA/ECDSA 等)对这个摘要进行加密,这样得到的结果就是原始数据的一个签名。

用户在验证数据时,只需要使用公钥解密出 Hash 摘要,然后自己再对数据进行一次同样的摘要,对比两个摘要是否相同即可。

因为数字签名多了非对称加密这一步,就能保证只有拥有私钥的人才能生成出正确的数字签名,达到了防止伪造签名的目的。

而数字摘要(Hash)则谁都可以计算出来,通常由可信方公布数据的 Hash 值,用户下载数据后,可通过 Hash 值对比来判断数据是否损坏,或者被人调包。

重点在于,Hash 摘要必须由可信方公布出来,否则不能保证安全性。而数字签名可以随数据一起提供,不需要担心被伪造。

JWT 是签名和数据一起提供的,因此必须使用签名才能保证安全性。

P.S. 在 Android/IOS 开发中,经常会遇到各类 API 或者 APP 商店要求提供 APP 的签名,还指明需要的是 MD5/SHA1 值。

这个地方需要填的 MD5/SHA1 值,实际上只是你「签名证书(=公钥+证书拥有者信息)」的「数字指纹/摘要」,和 JWT 的签名不是一回事。

前言

JWT 规范的详细说明请见「参考」部分的链接。这里主要说明一下 JWT 最常见的几种签名算法(JWA):HS256(HMAC-SHA256) 、RS256(RSA-SHA256) 还有 ES256(ECDSA-SHA256)。

这三种算法都是一种消息签名算法,得到的都只是一段无法还原的签名。区别在于消息签名与签名验证需要的 「key」不同。

HS256 使用同一个「secret_key」进行签名与验证(对称加密)。一旦 secret_key 泄漏,就毫无安全性可言了。

因此 HS256 只适合集中式认证,签名和验证都必须由可信方进行。

传统的单体应用广泛使用这种算法,但是请不要在任何分布式的架构中使用它!

RS256 是使用 RSA 私钥进行签名,使用 RSA 公钥进行验证。公钥即使泄漏也毫无影响,只要确保私钥安全就行。

RS256 可以将验证委托给其他应用,只要将公钥给他们就行。

ES256 和 RS256 一样,都使用私钥签名,公钥验证。算法速度上差距也不大,但是它的签名长度相对短很多(省流量),并且算法强度和 RS256 差不多。

对于单体应用而言,HS256 和 RS256 的安全性没有多大差别。

而对于需要进行多方验证的微服务架构而言,显然只有 RS256/ES256 才能提供足够的安全性。

在使用 RS256 时,只有「身份认证的微服务(auth)」需要用 RSA 私钥生成 JWT,其他微服务使用公开的公钥即可进行签名验证,私钥得到了更好的保护。

更进一步,「JWT 生成」和「JWT 公钥分发」都可以直接委托给第三方的通用工具,比如 hydra。

甚至「JWT 验证」也可以委托给「API 网关」来处理,应用自身可以把认证鉴权完全委托给外部的平台,而应用自身只需要专注于业务。这也是目前的发展趋势。

+--------------+-------------------------------+--------------------+

| "alg" Param | Digital Signature or MAC | Implementation |

| Value | Algorithm | Requirements |

+--------------+-------------------------------+--------------------+

| HS256 | HMAC using SHA-256 | Required |

| HS384 | HMAC using SHA-384 | Optional |

| HS512 | HMAC using SHA-512 | Optional |

| RS256 | RSASSA-PKCS1-v1_5 using | Recommended |

| | SHA-256 | |

| RS384 | RSASSA-PKCS1-v1_5 using | Optional |

| | SHA-384 | |

| RS512 | RSASSA-PKCS1-v1_5 using | Optional |

| | SHA-512 | |

| ES256 | ECDSA using P-256 and SHA-256 | Recommended+ |

| ES384 | ECDSA using P-384 and SHA-384 | Optional |

| ES512 | ECDSA using P-521 and SHA-512 | Optional |

| PS256 | RSASSA-PSS using SHA-256 and | Optional |

| | MGF1 with SHA-256 | |

| PS384 | RSASSA-PSS using SHA-384 and | Optional |

| | MGF1 with SHA-384 | |

| PS512 | RSASSA-PSS using SHA-512 and | Optional |

| | MGF1 with SHA-512 | |

| none | No digital signature or MAC | Optional |

| | performed | |

+--------------+-------------------------------+--------------------+

The use of "+" in the Implementation Requirements column indicates

that the requirement strength is likely to be increased in a future

version of the specification.

可以看到被标记为 Recommended 的只有 RS256 和 ES256。

ES256 使用 ECDSA 进行签名,它的安全性和运算速度目前和 RS256 差距不大,但是拥有更短的签名长度。

对于需要频繁发送的 JWT 而言,更短的长度长期下来可以节约大量流量。

因此更推荐使用 ES256 算法。

使用 OpenSSL 生成 RSA/ECC 公私钥

RS256 使用 RSA 算法进行签名,可通过如下命令生成 RSA 密钥:

# 1. 生成 2048 位(不是 256 位)的 RSA 密钥

openssl genrsa -out rsa-private-key.pem 2048

# 2. 通过密钥生成公钥

openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pem

ES256 使用 ECDSA 算法进行签名,该算法使用 ECC 密钥,生成命令如下:

# 1. 生成 ec 算法的私钥,使用 prime256v1 算法,密钥长度 256 位。(强度大于 2048 位的 RSA 密钥)

openssl ecparam -genkey -name prime256v1 -out ecc-private-key.pem

# 2. 通过密钥生成公钥

openssl ec -in ecc-private-key.pem -pubout -out ecc-public-key.pem

密钥的使用应该就不需要介绍了,各类语言都有对应 JWT 库处理这些,请自行查看文档。

如果是调试/学习 JWT,需要手动签名与验证的话,推荐使用 jwt 工具网站 - jwt.io

参考

java prime256v1_JWT 签名算法 HS256、RS256 及 ES256 及密钥生成相关推荐

  1. eclipse java类图_eclipse中。green UML 自动生成类图

    Green UML和AmaterasUML 两种 一.安装方法: 1.都是先安装GEF 通过eclipse-> install new software安装GEF的网址: http://down ...

  2. java dsa 私钥_OpenSSL工具 DSA私钥及公钥生成

    DSA私钥及公钥生成 两种生成方式,任选其一即可: 1.使用蚂蚁开放平台提供的工具生成: Windows, MAC OSX. 解压打开文件夹,直接运行"DSA生成公钥私钥转换PCKS8.ba ...

  3. Java 批量导出PPT为图片,并合并生成PDF

    Java 批量导出PPT为图片,并合并生成PDF 最近有小伙伴需要把PPT打印,但苦于PPT太多,浪费纸张,所以特别写了这个合并多张PPT到一张A4纸上并生成PDF方便打印的程序: 前期准备 把PPT ...

  4. Java调用有道翻译API包括APPID/密钥地址注册

    Java调用有道翻译API 因为上次发的资源用的我的APPID 导致我的服务已经停用了-- 现在把地址也一并奉上 希望都可以自己注册. APPID/密钥 注册地址:http://ai.youdao.c ...

  5. Java实现将文本内容、网址链接url,生成二维码与反解析

    2019独角兽企业重金招聘Python工程师标准>>> Java实现将文本内容.网址链接url,生成二维码与反解析 QR码的"QR"是Quick Response ...

  6. java利用core 工具实现二维码的生成与解析

    java利用core 工具实现二维码的生成与解析 简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反, ...

  7. java jce-KeyGenerator(密钥生成)

    java jce-KeyGenerator(密钥生成) 在开发时,总要涉及到数据的加密与解密,之前一直有些糊涂,最近看了 jce.jar的源码,来整理记录一下 接着上篇 java jce-Cipher ...

  8. Java(110):非对称加密RSA的使用(KeyPair生成密钥)

    Java(110):非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法.服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加 ...

  9. java 动态导出excel表单 无模板本地生成

    java 动态导出excel表单 无模板本地生成 这里使用的是alibaba的公共类excelWriter,注意在pom文件中要引入easyExcel的依赖 public void exportExc ...

最新文章

  1. 不忘初心,努力做最好的自己
  2. Linux 64bit下Oracle11g安装手册
  3. Linux上下载chronyd安装包,如何在Linux中安装和使用Chrony时间同步
  4. vue中v-for的使用以及注意事项
  5. C# FileStream
  6. matplotlib-plt.style.use
  7. 拓端tecdat|python爬虫进行Web抓取LDA主题语义数据分析报告
  8. Python 支付宝转账到银行卡二维码制作步骤分享
  9. android 汉字拼音转换工具
  10. vi中跳到首行或尾行
  11. Windows虚拟机的相关配置
  12. Java学习第二十四天
  13. 经济数学模型matlab,经济数学模型
  14. ChatGPT4.0中国怎么使用
  15. 用C语言编写程序,任意输入一个字符串,将其中的字符按从小到大的顺序重排
  16. 两个非常有意思的适合桌面使用的Linux task调度器: BFS和MuqSS
  17. Life Long Learning论文初探————Online Fast Adaptation and Knowledge Accumulation(OSAKA)
  18. 2022-2028全球2-氨基-4-乙基吡啶行业调研及趋势分析报告
  19. 【通信】前端中的几类数据交互方式
  20. 用python轻松玩转Excel,完成数据分析与统计,学习心得分享

热门文章

  1. 百度推广怎么删除的方法总结
  2. 基于PHP的网上女装销售系统设计与实现
  3. matlab 显示输出性能误差曲线,computerwork_1
  4. 前端小白:如何从零开始搭建Vue项目(完整步骤)
  5. WebAPI面试题总结03
  6. Eclipse 如何调整java和xml文件字体大小
  7. GitHub 项目推荐:俄罗斯小游戏、Markdown 幻灯片、头像生成器、Logo 制作工具、坦克大战...
  8. 站在工业互联时代,看“新晋独角兽”思谋科技的“远方”与“现实”
  9. 国外最佳十大虚拟主机提供商排行榜
  10. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)