数字签名的意义,看下百科:数字签名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、数字签名的更多相关文章

  1. tls1.2 rfc5246

    注:本文省略了部分开发协议才涉及到的内容,如字段类型的定义以及字段长度的运算,主要聚焦理解tls协议的运作方式,用于问题定位 tls协议包含2层协议:TLS Record 协议和TLS Handsha ...

  2. 传输安全HTTPS

    为什么要有 HTTPS 为什么要有 HTTPS?简单的回答是:"因为 HTTP 不安全".HTTP 怎么不安全呢? 通信的消息会被窃取,无法保证机密性(保密性):由于 HTTP 是 ...

  3. JDK自带方法实现RSA数字签名

    JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) --20151126 ...

  4. Java数字签名——RSA算法

    数字签名:带有密钥(公钥,私钥)的消息摘要算法. 验证数据的完整性,认证数据的来源,抗否性 OSI参考模型 私钥签名,公钥验证 签名算法:RSA,DSA,ECDSA 算法1 :RSA MD,SHA两类 ...

  5. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

  6. .NET Core加解密实战系列之——消息摘要与数字签名算法

    目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 H ...

  7. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...

  8. 2、摘要函数——MD2/MD4/MD5数字签名

    摘要是用来防止数据被私自改动的方法,其中用到的函数叫做摘要函数.这些函数的输入可以是任意大小的信息,但是输出是大小固定的摘要.摘要有个重要的特性:如果改变了输入信息的任何内容,即使改变一位,输出也将发 ...

  9. [Java 安全]消息摘要与数字签名

    消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知 ...

  10. 介绍DSA数字签名,非对称加密的另一种实现

    接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...

随机推荐

  1. HanLP — 汉字转拼音,简繁转换 -- JAVA

    目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...

  2. vue中class样式与内联样式

    (1):style使用 <div class="score" :style="{ color: colorComputed(item.status) }" ...

  3. npm, yarn和pnpm清理缓存

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  4. Scan Synthesis Practice

    不同上升沿触发器如何进行scan chain DFT实例 Synopsys 工具文档 Mentor DFT脚本 add_clocks 0 clk - 0表示上升沿 Synopsys DFT脚本 更改n ...

  5. Go-单元测试-Test

    单元测试 文件名以 _test.go 结尾 函数名以 Test 开头 函数参数固定 t *testing.T 运行单元测试 go test Demo 源文件 package unit import & ...

  6. [转帖]oracle查询表变化量

    根据变化量,可确定表的繁忙度,以及作为判断可能数据增长的对象. select obj.owner, obj.object_name, to_char(sn.BEGIN_INTERVAL_TIME,'y ...

  7. [转帖]nginx中rewrite和if的用法及配置

    nginx中rewrite和if的用法及配置 文章目录 nginx中rewrite和if的用法及配置 @[toc] 一.rewrite应用 1.rewrite跳转场景 2.rewrite实际场景 3. ...

  8. [转帖]linux系统主机双网卡实现路由转发问题与解决

    1. 环境 拓扑: 网卡配置: host1: 192.168.1.1/24 host2: 左eth0: 192.168.1.2/24 右eth1: 192.168.2.2/24 host3: 192. ...

  9. [转帖]alertmanager的使用

    https://www.jianshu.com/p/654d59325550 一.Alertanager的安装 1.下载   下载altermanager 2.安装 # 不同的平台下载不同的安装包 w ...

  10. [转帖]阿里发布自研ARM服务器芯片倚天710,不对外出售

    https://www.modb.pro/db/139440 10月19日,阿里巴巴旗下半导体公司平头哥发布自研云芯片倚天710,并宣称该芯片是业界性能最强的ARM服务器芯片,性能超过业界标杆20%, ...