基础算法

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本章介绍基础算法,涵盖加密与排序两大类。加密部分包括对称加密(如AES、SM4)、非对称加密(如RSA、SM2)、哈希摘要(如SHA-2、SM3)、电子签名及密码安全存储方案(如加盐、BCrypt)。排序部分讲解常见算法:冒泡、快排、归并、堆排序等,分析其时间复杂度与适用场景,并区分比较类与非比较类排序方法,强调实际应用中多采用混合策略以提升效率。(239字)

第二章 基础算法
1、加密算法
1.1【问】请介绍一下你知道的加密算法
参考回答:
一般分类如下
对称加密
非对称加密
哈希摘要
电子签名
密码存储
其中
对称加密常见的有: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 实现原理类似
2、排序
2.1 【问】请介绍一下你知道的排序算法有哪些
初级答法
常见的排序算法有:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等
P.S.
适合对以上排序算法一知半解,不太自信的同学,所谓言多必失,回答基本的就行
但要对接下来【各种排序的时间复杂度】的追问做到心中有数,这个必须背一背(参考后面的表格)
进阶答法
排序算法大致可分为两类:
A. 基于比较的排序算法
B. 非比较排序算法
比较排序算法有:快排、归并、堆排序、插入排序等
非比较排序算法有:计数排序、桶排序、基数排序等
比较排序算法中
快排、归并、堆排序能够达到 $$O(n \cdot \log{n})$$的(平均)时间复杂度
而插入排序的(平均)时间复杂度是 $$O(n^2$$
但并不是说复杂度高的算法就差,这要看数据规模和数据有序度,例如
数据量小,或是有序度高的数据就适合用插入排序
同样是数据量大的数据排序,如果数据的有序度高,归并优于快排
快排虽然是比较排序中最快的算法,但若是分区选取不好,反而会让排序效率降低
工业级的排序都是混合多种排序算法,例如 java 排序的实现就是混合了插入、归并与快排,不同的数据规模、不同场景下切换不同的排序算法
至于计数、桶、基数可以达到进一步让时间复杂度降至$$O(n$$,当然这与被排序数字的位数、范围等都有关系,您想知道的话,咱们可以细聊。
P.S.
适合对这些排序算法非常熟悉的同学,这时应注重回答的条理性
首先,对算法进行简单分类,让答案更为清晰
其次,不要等面试官来继续追问,而是主动回答各个算法的时间复杂度和适用场景,体现你对它们的熟悉
第三,一定要对各个算法的细节有充分准备,否则问到答不出来就尴尬了,这时不如降级为【初级答法】

相关文章
|
5月前
|
数据采集 开发者 Python
Python异步编程:解锁高性能并发新姿势
Python异步编程:解锁高性能并发新姿势
339 133
|
5月前
|
存储 运维 监控
Flink 实时计算 x SLS 存储下推:阿里云 OpenAPI 网关监控平台实践
本文由潘伟龙(阿里云可观测)、阮孝振(阿里云开放平台)撰写,介绍阿里云OpenAPI网关实时监控体系的构建实践。面对TB级日志、多维分析、秒级告警等挑战,采用Flink+SLS云原生方案,创新分层聚合+Source端谓词下推,实现60+地域、300+产品、200TB/日的高可用实时监控,故障发现从分钟级降至秒级。
882 8
Flink 实时计算 x SLS 存储下推:阿里云 OpenAPI 网关监控平台实践
|
存储 弹性计算 安全
阿里云服务器ECS实例选购参考:vCPU到云盘IOPS等指标详解
阿里云服务器ECS实例可以分为多种实例规格族,而根据CPU、内存等配置的不同,一种实例规格族又进一步细分为多种实例规格。这些实例规格包含了众多关键的性能指标,如 vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包 PPS、连接数、弹性网卡、云盘带宽、云盘 IOPS 等。深入理解这些性能指标,对于用户在阿里云服务器购买过程中选择最适合自己业务需求的实例规格至关重要。
|
8月前
|
存储 安全 搜索推荐
企业网站模板 网站源码下载 网站源码建站
在数字化时代,企业需专业网站拓展市场,网站源码建站因高性价比、强灵活性成中小企业首选,比定制开发成本低、比模板建站自由。选源码要明确需求、看质量售后与 SEO 扩展性,下载用官方渠道,经准备服务器域名、安装设置可上线,助企业低成本建高自由度安全网站。
3090 2
|
10月前
|
人工智能 供应链 API
淘宝API商品详情接口全解析:从基础数据到深度挖掘
淘宝API商品详情接口不仅提供基础数据,更通过深度挖掘实现从数据到洞察的跨越。开发者需结合业务场景选择合适分析方法,利用AI标签、区块链溯源等新技术,最终实现数据驱动的电商业务创新。
|
消息中间件 存储 监控
说说MQ在你项目中的应用(一)
本文总结了消息队列(MQ)在项目中的应用,主要围绕异步处理、系统解耦和流量削峰三大功能展开。通过分析短信通知和业务日志两个典型场景,介绍了MQ的实现方式及其优势。短信通知中,MQ用于异步发送短信并处理状态更新;业务日志中,Kafka作为高吞吐量的消息系统,负责收集和传输系统及用户行为日志,确保数据的可靠性和高效处理。MQ不仅提高了系统的灵活性和响应速度,还提供了重试机制和状态追踪等功能,保障了业务的稳定运行。
542 7
|
存储 虚拟化 云计算
|
程序员 编译器 C语言
C中的 malloc 和C++中的 new 有什么区别
在C语言中,`malloc`函数用于在运行时分配内存,返回指向所分配内存的指针,需显式包含头文件 `<stdlib.h>`。而在C++中,`new`不仅分配内存,还对其进行构造初始化,且直接使用类型声明即可,无需额外包含头文件。`new`还支持数组初始化,能更好地融入C++的面向对象特性,而`malloc`仅作为内存分配工具。使用完毕后,`free`和`delete`分别用于释放`malloc`和`new`分配的内存。
640 21
|
人工智能 安全 大数据
新一代信息通信技术
新一代信息通信技术
1815 5
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
537 4

热门文章

最新文章