腾讯csig 运营开发 一面(凉)
时间:2024.03.08
流程1:自我介绍
随便介绍了下基本信息+学校+项目经历
流程2:项目八股
1. 讲一下实习项目&实习期间有没有感觉有什么比较难的点
2. 讲一下项目2,springcloudoauth2是怎么去实现单点登陆的
3. oauth2具体是怎么回事
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容
OAuth 2 有四种授权模式,分别是
- 授权码模式(authorization code):端跳转B端的一个输入密码界面,登录后B端再在url中返回一个CODE给A端,A端后续在后端发起请求拿这个CODE去获得授权凭证,然后后续再靠授权凭证去获得数据。这里CODE是短时效且一次性的,所以较为安全
- 隐式授权(implicit):A端跳转B端的一个输入密码界面,登录后B端再在url中返回一个授权凭证给A端,A端后续拿这个授权凭证去获得数据,问题就是url中的授权凭证容易泄露
- 密码模式(resource owner password credentials):直接向A端输密码,A端拿密码去登录B端,然后拿数据,但是A端可能恶意保存密码信息,只适合各个端都是自己人的情况下
- 客户端模式(client credentials):直接让A端访问B端资源,问题就是A端权限过大,想访问啥就访问啥,只适合内部微服务间调用
5. jwt结构原理
头部.载荷.签名
其中签名类似: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
secret为密钥,HMACSHA256为头部中指定的签名算法
6. jwt能不能被反解析
能,base64编码随便就能解析,所以token中不能放敏感信息。但是因为签名有加密算法的加持,所以不知道密钥的情况下无法伪造token
7. 怎么设计的退出登陆,准备怎么做
8. jwt和redis配合的退出登陆你觉得好不好
没啥问题,能随时踢人下线,监控在线人数,等功能
9. 如果现在有一个需求是,管理员改了某个用户的密码,然后就要马上把他给下线,或者我就是要马上下线某个人,怎么处理
10. 拿jwt放redis你怎么去存储呢,管理员怎么能找到具体那个jwt是现在这个用户的呢
id为key,jwt为value。在springsecurity中,拿到jwt后是能解析载荷中数据并放入springContextHolder的,整个过程中只要载荷中原本存储了用户id,都能知道当前是哪个用户
11. 那你说这样载荷里面还有存储id的必要吗
- 自我包含性:JWT的设计理念之一就是自我包含性,这意味着所有的必要信息都应该包含在Token内部。这使得服务端无需查询数据库或其他存储系统就可以验证和处理Token。
- 减轻数据库负担:由于JWT包含了必要的用户信息,因此减少了对于数据库或其他持久化存储系统的依赖,降低了每次请求时的延迟。
- 状态无感知:由于服务器不保存JWT的状态信息,因此服务器可以在不保持任何会话状态的情况下处理请求。这对于水平扩展非常重要,尤其是在微服务架构中。
- 简化认证逻辑:在JWT中包含用户ID可以让认证逻辑更加简单,因为解码JWT即可获取用户身份信息。
12. 你数据库用户密码怎么加密的
哈希加密,使用BcryptPasswordEncode
13. 那你知道BcryptPasswordEncode的原理吗
几乎无法破解,正常比对密码并不是解密数据库中存储的密文密码,而是把用户输入的加密后使用match方法去比对
BcryptPasswordEncoder
是 Spring Security 中用于密码加密的一种工具类,它基于 bcrypt 算法。bcrypt 是一种密码散列函数,特别设计用于密码存储,旨在抵抗暴力攻击和其他密码破解尝试。以下是 BcryptPasswordEncoder
的一些关键原理和特点:
Bcrypt 的原理:
- 散列算法:bcrypt 使用 Blowfish 密码算法的一个变种来创建密码散列。Blowfish 是一种块加密算法,但 bcrypt 只使用了 Blowfish 的一部分特性。
- 盐(Salt):为了防止彩虹表攻击(预先计算好的散列表),bcrypt 在散列过程中使用了一个随机生成的盐(salt)。盐是附加到原始密码上的随机数据,这样即使两个用户的密码相同,由于盐的不同,它们的散列值也会不同。
- 迭代次数(Cost Factor):bcrypt 允许配置迭代次数(也称为成本因子),这增加了计算散列所需的时间。较高的迭代次数可以显著增加攻击者计算散列的成本,从而增加破解难度。
- 内存密集型:bcrypt 设计成内存密集型的,这样就难以利用GPU进行并行攻击。
BcryptPasswordEncoder 的使用:
在 Spring Security 中,BcryptPasswordEncoder
提供了一个简便的方式来进行密码的加密和验证。以下是一些基本操作:
- 加密密码:使用
encode
方法来加密用户提供的原始密码。 - 验证密码:使用
matches
方法来验证用户提交的密码是否与存储的散列值匹配。
Bcrypt 的 matches
方法原理:
- 读取存储的加密密码:当调用 matches 方法时,首先会读取存储的加密密码。这个加密密码通常包含以下几部分:版本标识符(如 $2a$)。成本因子(迭代次数,如 $10$)。盐(randomSalt)。密码散列值(hashedPassword)。
- 解析元数据:从存储的加密密码中解析出版本标识符、成本因子和盐。这些信息将用于后续的密码验证过程。
- 使用相同的盐和迭代次数:使用解析出的盐和迭代次数对用户输入的密码进行加密。这是非常重要的一步,因为不同的盐会导致不同的散列值,即使密码相同。
- 比较散列值:将用户输入密码经过相同参数加密后的散列值与存储的加密密码中的散列值进行比较。如果两者完全一致,则说明密码正确;否则,密码错误。
14. 你知道有那些加密方式
15. 怎么加密才能防止密码被破解
16. mysql的innodb用的那种数据结构,为什么
17. 你mysql用的哪个版本
5.7过了就是8.0了
18. 你觉得什么样才算微服务,什么是微服务,说说你的理解
19. 我看你写了Vue,你谈谈你对他的理解,其中响应式怎么回事,知道哪些底层
不该乱写会前端,虽然确实能写前端代码,但是八股是一点没背
20. 你微服务项目都是怎么部署的,部署到哪的(如实回答,我说我宝塔linux部署的,不太熟悉原生linux部署方式。以及说了拆分部署到了多个云服务器上)
应该是这个:docker部署微服务
记个java -jar 得了
流程3:算法
lc300 最长递增子序列
自我总结
个人还是太菜,回答磕磕碰碰,很多只浮于表面没有深入,算法也拉胯。
#面试记录##腾讯面试#