第二章 基础算法

简介: 第二章 基础算法

1、加密算法
1.1【问】请介绍一下你知道的加密算法
参考回答:
一般分类如下

  1. 对称加密
  2. 非对称加密
  3. 哈希摘要
  4. 电子签名
  5. 密码存储
    其中
    ● 对称加密常见的有:DES、AES 等,国家标准有 SM4
    ● 非对称加密常见的有:RSA,ECDSA 等,国家标准有 SM2
    ● 哈希摘要有:MD5、SHA-2、SHA-3 等,国家标准有 SM3
    ● 电子签名有:通常会结合 RSA、ECDSA 和哈希摘要完成签名,或者是 HMAC
    ● 密码存储:直接使用哈希摘要作为密码存储、加盐存储、BCrypt

1.2【追问】解释对称加密、非对称加密、哈希摘要
● 对称加密
○ 加密和解密的密钥使用同一个
○ 因为密钥只有一个,所以密钥需要妥善保管
○ 加解密速度快
● 非对称加密
○ 密钥分成公钥、私钥,其中公钥用来加密、私钥用来解密
○ 只需将私钥妥善保管,公钥可以对外公开
○ 如果是双向通信保证传输数据安全,需要双方各产生一对密钥
■ A 把 A公钥 给 B,B 把 B公钥 给 A,他们各自持有自己的私钥和对方的公钥
■ A 要发消息给 B,用 B公钥 加密数据后传输,B 收到后用 B私钥 解密数据
■ 类似的 B 要发消息给 A,用 A公钥 加密数据后传输,A 收到后用 A私钥 解密数据
○ 相对对称加密、加解密速度慢
● 哈希摘要,摘要就是将原始数据的特征提取出来,它能够代表原始数据,可以用作数据的完整性校验
○ 举个例子,张三对应着完整数据
○ 描述张三时,会用它的特征来描述:他名叫张三、男性、30多岁、秃顶、从事 java 开发、年薪百万,这些特征就对应着哈希摘要,以后拿到这段描述,就知道是在说张三这个人
○ 为什么说摘要能区分不同数据呢,看这段描述:还是名叫张三、男性、30多岁、秃顶、从事 java 开发、月薪八千,有一个特征不符吧,这时可以断定,此张三非彼张三

1.3【追问】解释签名算法
电子签名,主要用于防止数据被篡改。
先思考一下单纯用摘要算法能否防篡改?例如

● 发送者想把一段消息发给接收者
● 中途 message 被坏人改成了 massage(摘要没改)
● 但由于发送者同时发送了消息的摘要,一旦接收者验证摘要,就可以发现消息被改过了
坏人开始冒坏水

● 但摘要算法都其实都是公开的(例如 SHA-256),坏人也能用相同的摘要算法
● 一旦这回把摘要也一起改了发给接收者,接收者就发现不了
怎么解决?

● 发送者这回把消息连同一个密钥一起做摘要运算,密钥在发送者本地不随网络传输
● 坏人不知道密钥是什么,自然无法伪造摘要
● 密钥也可以是两把:公钥和私钥。私钥留给发送方签名,公钥给接收方验证签名,参考下图
○ 注意:验签和加密是用对方公钥,签名和解密是用自己私钥。不要弄混

1.4【追问】你们项目中密码如何存储?
● 首先,明文肯定是不行的
● 第二,单纯使用 MD5、SHA-2 将密码摘要后存储也不行,简单密码很容易被彩虹表攻击,例如
○ 攻击者可以把常用密码和它们的 MD5 摘要结果放在被称作【彩虹表】的表里,反查就能查到原始密码
加密结果 原始密码
e10adc3949ba59abbe56e057f20f883e 123456
e80b5017098950fc58aad83c8c14978e abcdef
... ...
因此
● 要么提示用户输入足够强度的密码,增加破解难度
● 要么我们帮用户增加密码的复杂度,增加破解难度
○ 可以在用户简单密码基础上加上一段盐值,让密码变得复杂
○ 可以进行多次迭代哈希摘要运算,而不是一次摘要运算
● 还有一种办法就是用 BCrypt,它不仅采用了多次迭代和加盐,还可以控制成本因子来增加哈希运算量,让攻击者知难而退

1.5【追问】比较一下 DES、AES、SM4
它们都是对称加密算法
● DES(数据加密标准)使用56位密钥,已经不推荐使用
● AES(高级加密标准)支持 128、192、256位密钥长度,在全球范围内广泛使用
● SM4(国家商用密码算法)支持 128位密钥,在中国范围内使用

1.6【追问】比较一下 RSA、ECDSA 和 SM2
它们都是非对称加密算法
● RSA 的密钥长度通常为 1024~4096,而 SM2 的密钥长度是 256
● SM2 密钥长度不需要那么长,是因为它底层依赖的是椭圆曲线、离散对数,反过来 RSA 底层依赖的是大数分解,前者在相同安全级别下有更快的运算效率
● SM2 是中国国家密码算法,在国内受政策支持和推广
● ECDSA 与 SM2 实现原理类似

相关文章
|
3月前
|
存储 Java Apache
Velocityd的使用
Apache Velocity 是一个高效的 Java 模板引擎,主要用于动态文本生成,如网页、邮件或配置文件。其核心概念包括模板(Template)、上下文(Context)和引擎(VelocityEngine)。模板包含静态内容与动态指令,通过上下文传入数据,由引擎解析生成最终输出。Velocity 语法简洁,支持变量、条件判断、循环等逻辑控制,适用于 Web 开发及后端渲染场景。在 Spring Boot 等框架中集成方便,但需注意路径配置、编码设置及兼容性问题。
124 1
|
3月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
323 57
|
3月前
|
运维 Kubernetes Java
物理部署图
物理部署图用于描述系统运行时的结构,展示硬件配置与软件部署在网络中的方式。它帮助理解分布式系统的部署架构,核心元素包括节点、构建、物件、连接和框架,常用于指导软硬件的协同运行与运维管理。
113 0
|
3月前
|
缓存 Java
对比 synchronized 和 volatile
`synchronized` 和 `volatile` 是 Java 并发编程中的两个关键机制,各有侧重。`synchronized` 用于实现线程的互斥访问,保证原子性、可见性和有序性,适用于需要锁的场景;而 `volatile` 更轻量,仅确保变量的可见性和有序性,适用于状态标志等无需复合操作的场景。两者可互补使用,如双重检查单例中结合二者优势。合理选择有助于提升并发性能与代码安全性。
155 0
|
3月前
|
Java Spring
聊聊你对SpringBoot框架的理解 ?
SpringBoot是Spring家族中流行的子项目,旨在简化Spring框架开发的繁琐配置。它主要提供三大功能:starter起步依赖简化依赖管理,自动配置根据条件创建Bean,以及内嵌Web服务器支持Jar包运行,极大提升了开发效率。
141 0
|
3月前
|
存储 缓存 NoSQL
mybatisplus一二级缓存
MyBatis-Plus 继承并优化了 MyBatis 的一级与二级缓存机制。一级缓存默认开启,作用于 SqlSession,适用于单次会话内的重复查询;二级缓存需手动开启,跨 SqlSession 共享,适合提升多用户并发性能。支持集成 Redis 等外部存储,增强缓存能力。
|
3月前
|
SQL 缓存 Java
MyBatis场景面试题
MyBatis与MyBatisPlus均属ORM框架,前者擅长复杂SQL及动态查询,后者封装API简化单表操作。常用XML标签如if、foreach提升SQL灵活性。MyBatis支持一级(SqlSession级)与二级(NameSpace级)缓存,提升查询效率。#{}防SQL注入,${}用于动态表名等场景。
205 62
|
3月前
|
Web App开发 编解码 网络协议
直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
224 5
直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
|
3月前
|
SQL Java 数据库连接
updateByPrimaryKeySelective()方法因字段为null导致的更新不成功问题解决办法
为了让这个解决方案更容易融入到现有系统中,其实现应该尽量简单且无缝,避免重复代码,并提高代码复用性。结合上述方法中提供的策略,应可以解决在使用 `updateByPrimaryKeySelective()`方法时因字段为null导致的更新不成功问题。请根据实际业务需求和上下文选择最合适的方案。这样的解决方案能够达到更佳的代码质量和维护性。
276 14
|
3月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
244 14