RSAToken 的签名算法 SHA256withRSA、数字签名
数字签名的意义,看下百科:数字签名sign可不是对数据的加密和解密,而是生成签名和验证签名。
https://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95/12724298

================================
1. 我肯定不会使用对称秘钥的签名,因为对称秘钥,开发者可以知道秘钥了,安全意义有限,且对称秘钥的签名没有意义,因为直接用对称秘钥加密就可以了,再搞个签名没有意义。
所以接下来主要是讨论“非对称秘钥的签名”;
我自己设计的token与 jwt的不同,jwt的头部签名算法声明,有点啰嗦没有必要,因为我们自己开发的项目不可能多少token的颁发处,多种签名算法,那样反而会乱七八糟,所以我去除了jwt的头部,
我自己设计的token只包含2部分,payload部分 + 签名 部分;
首先要理解 签名算法 与 aes 和 rsa加密算法 是不同的,不要搞混淆。
aes我通常使用 aes128 加解密。
RSA我通常使用默认的加解密。
签名算法有很多,jdk8官方的api文档如下:




通常签名算法,推荐使用:SHA256withRSA

知道了java支持的签名算法之后,再去看下 jwt,jwt就是头部算法声明 + payload + 签名来组成,jwt为了 简化头部的字符串占用,简化了名称,我们看下 jwt的签名算法 支持:
| 加密方式 | 支持情况 | 全称 |
|---|---|---|
| HS256 | HMAC with SHA-256 | |
| HS384 | HMAC with SHA-384 | |
| HS512 | HMAC with SHA-512 | |
| PS256 | RSAPSS with SHA-256 | |
| PS384 | RSAPSS with SHA-384 | |
| RS256 | RSAPSS with SHA-512 | |
| RS384 | RSASSA-PKCS1-v1_5 with SHA-256 | |
| RS512 | RSASSA-PKCS1-v1_5 with SHA-384 | |
| ES256 | RSASSA-PKCS1-v1_5 with SHA-512 | |
| ES256K | ECDSA with curve P-256 and SHA-256 | |
| ES384 | ||
| ES512 | ECDSA with curve P-384 and SHA-384 | |
| EdDSA | Edwards-curve DSA |

三、算法加密方式简介
在比较签名算法之前,需要先了解一下原理,对算法有基本认知,便于测试预期。
3.1 SHA简介
SHA-2是一种散列算法(哈希函数),细分了6个算法标准,SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256,他们的差异大概是一些生成摘要长度、循环运行次数等。
3.2 HMAC简介
HMAC(Hash-based Message Authentication Code)是对称加密,加密和解密用的是相同的密钥,主要用于消息防篡改,哈希算法可以选择md5、sha1、sha2(sha256,sha385,sha512)。

- 如果密钥比分组长度短,则末尾填充0直到达到分组长度;如果密钥比分组长度还长,则会用哈希计算出密钥的散列值,然后让这个散列值作为HMAC的密钥,散列长度一般仍然小于分组长度,所以散列之后仍然要填充0。
- 如果是SHA-1或SHA-256,则分组长度为64;如果是SHA-384和SHA-512。
- 密钥长度如果小于哈希输出数据字长(SHA-256输出256位,所以为32,384为48,512为64),则加密效果不佳,如果超出这个长度,并不能带来显著的安全强度提升。
另外,从官方jwt.io的网页推荐可以看出,也是希望使用和哈希函数匹配的长度(your-256-bit-secret):

3.3 RSA相关简介
RSA是非对称加密,算法运行较慢。RSA没有加入随机数,因此如果攻击者遍历猜测所有的原文,可以通过对比相同的加密密文选择出真实原文,为了防止这种情况,RSA加入了padding机制,对数据进行填充。

RSA主流的签名模式为RSA-PSS(Probabilistic Signature Scheme)和RSA-PCKS#1_v1.5(Public Key Cryptography Standards),PSS是私钥签名的填充模式(padding mode),相对而言这种方式更加安全,openssl-1.1.x以后(server key exchange阶段)默认使用PSS填充。
发送方加密并不是对数据直接进行加密,而是通过SHA等散列函数对数据内容进行哈希之后,再对这个哈希值用公钥进行加密。接收方同样对内容计算SHA散列函数哈希值,然后用私钥解开加密的哈希值,比对两个哈希值是否一致,如果一致则说明数据内容没有被篡改过。
如果业务上面只是自己签发自己验证JWT,公钥私钥都存放在同一个地方,从便利性角度而言和HMAC没有差异。
RSA有个选项是“密钥位数”,有512、1024、2048、4096等,尽管公私钥都是存在服务器的,但为了防止暴力猜测破解,仍然使用1024位以上比较安全。
此博主最终的结论:
4.2.6 列表比较
| 比较项 | 考虑因素 | 结论 |
|---|---|---|
| 签名长度 | 使用方的内存占用 | HS、ES可以接受,RS过长 |
| 生成速度 | 频繁生成JWT的业务 | HS最快,RS和ES接近 |
| 校验速度 | 频繁校验JWT的业务 | HS最快,RS略慢,ES很慢 |
| 生成CPU | 对CPU资源有要求 | HS最少,RS、ES都较多,RS略少于ES |
| 校验CPU | 对CPU资源有要求 | HS和RS都很少,ES较多 |
4.3 优缺点和适用场景
(1)HS256 / HS384 / HS512
优点:速度快、生成校验CPU少、签名位数少
缺点:对称加密,密钥泄漏影响大;不适合多服务校验场景
注意:密钥位数的提高并不能显著提高安全性。
(2)RS256 / RS384 / RS512
优点:校验速度可以接受、安全等级高、适合多服务校验场景
缺点:CPU消耗较大,生成速度较慢(但生成一般都是低频率事件),签名位数多(有嵌入式设备一定要注意了)
(3)ES256 / ES256K / ES384 / ES512
优点:安全等级高、适合多服务校验场景
缺点:CPU消耗严重(对普通应用不划算的)、生成和校验速度较慢,尤其是校验速度
【推荐方案选择】
普通应用推荐使用HS,并且定期轮换密钥避免对称性加密密钥泄漏的风险;
较为复杂的应用可用RS
安全应用可用ES
RSAToken 的签名算法 SHA256withRSA、数字签名的更多相关文章
- tls1.2 rfc5246
注:本文省略了部分开发协议才涉及到的内容,如字段类型的定义以及字段长度的运算,主要聚焦理解tls协议的运作方式,用于问题定位 tls协议包含2层协议:TLS Record 协议和TLS Handsha ...
- 传输安全HTTPS
为什么要有 HTTPS 为什么要有 HTTPS?简单的回答是:"因为 HTTP 不安全".HTTP 怎么不安全呢? 通信的消息会被窃取,无法保证机密性(保密性):由于 HTTP 是 ...
- JDK自带方法实现RSA数字签名
JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) --20151126 ...
- Java数字签名——RSA算法
数字签名:带有密钥(公钥,私钥)的消息摘要算法. 验证数据的完整性,认证数据的来源,抗否性 OSI参考模型 私钥签名,公钥验证 签名算法:RSA,DSA,ECDSA 算法1 :RSA MD,SHA两类 ...
- 数字签名算法rsa
数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...
- .NET Core加解密实战系列之——消息摘要与数字签名算法
目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 H ...
- 前后端java+vue 实现rsa 加解密与摘要签名算法
RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...
- 2、摘要函数——MD2/MD4/MD5数字签名
摘要是用来防止数据被私自改动的方法,其中用到的函数叫做摘要函数.这些函数的输入可以是任意大小的信息,但是输出是大小固定的摘要.摘要有个重要的特性:如果改变了输入信息的任何内容,即使改变一位,输出也将发 ...
- [Java 安全]消息摘要与数字签名
消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知 ...
- 介绍DSA数字签名,非对称加密的另一种实现
接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...
随机推荐
- <vue 路由 5、动态路由-标签上传递参数>
一.效果 在about页面点击"我的",路径里传入了参数zhangsan,在"我的"页面里接收传递过来的张三并展现出来.注:标签中传递参数写法 二.代码结构 注 ...
- 机器学习-线性分类-支持向量机SVM-SMO算法-14
目录 1. SVM算法总结 2. SMO算法 1. SVM算法总结 选择 核函数 以及对应的 超参数 为什么要选择核函数? 升维 将线性问题不可分问题 升维后转化成 线性可分的问题 核函数 有那些? ...
- python3使用json、pickle和sqlite3持久化存储字典对象
技术背景 在各种python的项目中,我们时常要持久化的在系统中存储各式各样的python的数据结构,常用的比如字典等.尤其是在云服务类型中的python项目中,要持久化或者临时的在缓存中储存一些用户 ...
- 最近遇到的问题记录:UrlEncode、UrlDecode
本文阅读前了解知识:什么时候需要使用UrlEncode和UrlDecode函数 作者使用谷歌浏览器,通过按下F12对第三方网站http协议的接口抓包进行分析操作. 场景 运维小哥哥偶尔使用某某外包公司 ...
- Kafka 社区KIP-382中文译文(MirrorMaker2/集群复制/高可用/灾难恢复)
译者:对于Kafka高可用的课题,我想每个公司都有自己的方案及思考,这是一个仁者见仁智者见智的命题,而社区给出了一个较大的特性,即MirrorMaker 2.0,不论是准备做高可用还是单纯的数据备份, ...
- [转帖]Nginx - 根据IP分配不同的访问后端
https://www.cnblogs.com/hukey/p/11868017.html 1. 需求分析 为了在线上环境提供测试分支,规定将某IP转发到测试程序地址.如果是 ngx 直接对外,采用 ...
- [转帖]Strong crypto defaults in RHEL 8 and deprecation of weak crypto algorithms
https://access.redhat.com/articles/3642912 TABLE OF CONTENTS What policies are provided? Removed c ...
- [转帖]CTF -bugku-misc(持续更新直到全部刷完)
CTF -bugku-misc(持续更新直到全部刷完) https://www.cnblogs.com/cat47/p/11432475.html 1.签到题 点开可见.(这题就不浪费键盘了) CTF ...
- [转帖]Linux内核映像vmlinux、Image、zImage、uImage区别
https://zhuanlan.zhihu.com/p/466226177 本文介绍几种常用的Linux内核映像的区别. 一.vmlinux vmlinux:Linux内核编译出来的原始的内核文件, ...
- [转帖]Redis Scan 原理解析与踩坑
https://www.cnblogs.com/jelly12345/p/16424080.html 1. 概述由于 Redis 是单线程在处理用户的命令,而 Keys 命令会一次性遍历所有 Key, ...