首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
乔乔的pluck之剑
西安电子科技大学 Java
关注
已关注
取消关注
@后端劝退第二人:
腾讯实基一面 项目部分面经(挂)
分享出来积攒福气。 写这篇文章是为了记录我面试pcg时平时没有留意或者钻研的地方。面试是根据项目问的问题:为什么采用jwt存储token? 我的项目是微服务项目,里面部署了资源服务和认证服务,这里选择jwt作为token一方面是可以存储用户的信息,可以将用户身份信息存储在令牌中,用户认证通过后认证服务颁发令牌给用户,用户将令牌存储在客户端,去访问应用服务时携带令牌去访问,服务端从jwt解析出用户信息。也就是所说的无状态认证。如果是session认证的话存储在服务端会加大服务端的压力,不适合运用于分布式系统。总结来说就是:灵活性,一致性,故障发生的可用性,以及多平台维护的代价。 另一个目的也就是去实行资源的自认证,每次经过网关的时候,就判断令牌的有效性。以此来决定是否可以访问该资源。jwt存储信息都存储在哪里,关键信息存储在里面么?jwt的组成部分一般为三部分,头部,负载,和签名部分。我存储的信息一般放置于负载部分,当然,肯定是不建议将密码等私密信息存储在里面的。spring security是如何和jwt进行结合的呢?换句话说,如何设置springsecurity的令牌? 这里我之前都是知道怎么去运用,并没有去看过源码,只知道这么配置一下就好了。但项目被拷打了,问了我意想不到的地方,但还是要好好去琢磨琢磨。首先我们看令牌的配置在哪里AuthorizationServerConfigurerAdapter这个类ClientDetailsServiceConfigurer客户端详情的配置AuthorizationServerSecurityConfigurer安全配置,谁能允许通过说白了这三个配置都是需要你去实现的。但是我们这里只讲令牌。这个bean是我们自己配置的,定义了bean并指定了名字。配置一个TokenConfig定义令牌服务:可以看到这两个bean的名字是一样的。refreshToken解决的其实是令牌的续期问题。当jwt令牌快过期时使用刷新令牌可以再次生成jwt令牌。jwt的加密方式是什么?可以知道,jwt的整体可以用HMAC算法或使用RSA的公钥/私钥对来签名。我们的整理就是 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)这样的结构。使用base64编码对header和payload两个部分进行编码,再和secret一起加密。base64:在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。 但是原理我个人认为看一遍就好了,不用去死记硬背。数据库里的密码是明文存储的吗?前后端密码验证时如何比对的?这个是我自己思考的问题,也是我重新看代码的时候看的。说到这里,我们不妨从头开始顺一下spring security自带的流程。我们输入的密码一般是变成表单提交,那么它会被封装到AUthentication里。我们可以看到这里的调用关系AuthenticationManager调用DaoAuthenticationProvider,而DaoAuthenticationProvider里的UserDetailsService里又会调用loadUserByUsername来获取用户的信息,并将获取到的用户信息以springsecurity里的Userdetail方式返回。注意这里通过PasswordEncoder的BCryptPasswordEncoder方式,这个是暗文存储。我觉得可以记一下这个加密方式,因为被问了,我就没记住这个,因为我觉得这个不是重点但还真问了。BCryptPasswordEncoder配置这个来决定security框架自身的密码比对。密码的形式,这个是自带的!!当然也可以手动的自行配置,不用框架自带的 UserDetailsService也就是可以重写loadUserByUsername方法和比对方式。这里就会发现,encode里竟然发现了salt字样,没错,BCryptPasswordEncoder里面自带加盐操作,如果你不指定,那么他会按照自己的配置的一些值来给你加盐。获取盐代码:加密算法:通过输入密码和根据密码特点获得的盐来进行加密random.nextBytes(rnd);因为每次的 salt 不同,因此每次的 hash 也不同。这样就可以使得相同的 明文 生成不同的 密文那么如果这个数据库中的密码,我们是通过BCryptPasswordEncoder加密的存储在数据库当然中的。我们应该如何进行比较用户输入的是否正确呢?因为用户输入的密码也不是暗文的啊。那么怎么知道用户输入的密码和数据库中的密码是否一致呢?这里还是要看BCryptPasswordEncoder的源码继续跟踪hashpw这个方法,我们会发现和加密时候的方法hashpw是一样的。我们会发现,这个方法会将自己定义的盐取出来,并且base64解码,最后和我们的密码加密一下,然后和之前的数据库的暗文进行对比。是否了解加盐,如何加盐,加盐的意义是什么?个人理解我觉得可以和jwt的secret部分做类比。都是通过添加随机的一部分。安全的提高就是:随机数+混入形式。 密码加盐里包含随机值和加密方式。随机值是随机产生的,并且以随机的方式混在原始密码里面,然后按照加密方式生成一串字符串保存在服务器。换言之,这个是单向的,电脑也不知道客户的原始密码,即使知道加密方式,反向推出的加密前的字符串也是真正密码与随机值混合后的结果,从而无法解析用户的真正密码。那么是如何验证密码的呢?当你再次输入密码,会以相同的加盐方式生成字符串,如果和之前的一致,则通过。而其它用户无法获得这种加密方式:即生成哪些随机数,以什么方式混入进去,自然就很安全。如何生成随机字符串?可以使用org.apache.commons.lang包下有一个RandomStringUtils类,其中有一个randomAlphanumeric(int length)函数,可以随机生成一个长度为length的字符串。 RandomStringUtils.randomAlphanumeric(10);加盐的意义用gpt解释的来看吧。 前后端密码验证的时候是如何比对的?jwt的密钥存储在哪里?这里附属上gptjwt的负载部分内容是从哪获得的?这个也是自己的思考,其实我也好奇为什么这么设置就可以改变jwt里负载的内容。这个还得跟踪spring security里代码点击一下JwtAccessTokenConverter 我们可一看到这个里面实现了两个类,我们可以通过tokenenhance里的enhance编写自己的enhance方法来增强扩展这个token信息。当然这里要看的是AccessTokenConverter一直好奇这里的负载信息哪来的,这就有个信息提取方法终于看到了这个username这里其实也就是我们在返回userdetail信息里的username而extractAutentication里的其他信息我画红色的也来自于我们的客户端配置 public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient()// client_id .secret()//客户端密钥 .resourceIds()//资源列表 .authorizedGrantTypes()// 该client允许的授权类型 .scopes()// 允许的授权范围 .autoApprove()//false跳转到授权页面 //客户端接收授权码的重定向地址 .redirectUris() ; }最终解析我们的jwt令牌,里面的负载部分就会如上述形式呈现。在这个user_name里面
点赞 9
评论 6
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 16:04
欣旺达_嵌入式软件工程师(准入职员工)
网易互娱内推,网易互娱内推码
网易**不管问你啥,记住一个话术原则小小的提醒下各位留子:**时不要直来直去有啥说啥;千万得多思考别说太满给自己留个思考或回旋的余地・1、被问 “有没有接触过网易的产品”(哪怕了解不多)别直接说 “没有”(容易显得缺乏兴趣)试试:“之前用过网易云音乐和网易新闻,对产品的界面设计和功能逻辑有过留意。虽然没有深入研究,但能感受到网易产品注重用户体验的特点,入职后会系统学习相关产品知识”・2、被问 “能接受高强度的项目加班吗”别勉强说 “没问题”(后续可能难以承受)试试:“我理解互联网行业项目推进时需要集中精力,在关键节点愿意配合团队加班。但也会注重提升工作效率,合理规划时间,尽量在正常工作时间完成...
点赞
评论
收藏
分享
01-26 17:10
卓驭科技_HR(准入职员工)
卓驭(大疆车载)内推
卓驭 嵌入式中间件实习 面经写一写面经,回馈一下社区。⌚️timeline:五月底👋part1:自我介绍 && 项目介绍1. 项目里的内存占用,资源使用的性能评估?性能优化的思考?2. 端侧大模型的选型?3. 机器人比赛中最难的一个问题?技术方案的选择用了多长的时间?4. 之前实习的主要工作?方案是如何确定的?5. 对车载中间件的了解?6. 。。。忘了🤏part2:八股拷打1. 设计模式?平时开发有用到过哪一些设计模式吗?2. 对多态的了解?静态and动态?3. 虚函数里面父类和子类的交互?4. C++容器中vector和list的差异?5. vector的底层实现原理?扩...
点赞
评论
收藏
分享
2025-12-02 23:29
腾讯云智研发_后台开发(准入职员工)
小米offer
小米offer了,北京大白菜,我服啦😂😂hr说我是排序靠前的
ccddfa:
排序靠前就当hr在放屁
牛客在线求职答疑中心
点赞
评论
收藏
分享
01-25 10:41
清华大学 Java
每天都在被动加班
每天都在被动加班,感觉自己仿佛成了公司的加班机器。明明手头的活儿早就做完了,但还是得等到七点以后才能离开办公室。因为,如果提前走了,月度加班排行榜一出来,我的名字就会显得特别刺眼。每次看到排行榜,我心里都不禁有些焦虑。大家的加班时间一一列出来,自己总不想掉队,特别是当看到别人加班到七八点,自己却在六点钟打包准备离开时,那种“落后的”感觉,真是让人不太舒服。于是,哪怕已经完成了当天的任务,我还是习惯性地坐在电脑前,刷刷邮件、看会儿文档,尽量让自己看起来“忙碌”。但每次这种情况,我都在想,自己到底是在“工作”还是在“装忙”?加班似乎变成了一个没有实质意义的竞争,大家拼的是时间,而不是效率。其实,我...
饿魔:
加班还弄排行榜
聊聊你的被动加班经历
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
1796
2
...
J人永远闲不下来于是去提前实习
1694
3
...
拥抱AI,程序员的最后出路
1528
4
...
mentor视角下的优秀实习生
1457
5
...
真正会被取代的,是你心里面的幻觉
1351
6
...
努力挣钱的意义具象化了
1160
7
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1104
8
...
大厂提前实习对AI开发的新感悟
1087
9
...
去独角兽做龙头还是去大厂做凤尾
1012
10
...
我身材再曼妙,也没有我的工资好笑!
948
创作者周榜
更多
正在热议
更多
#
牛客吐槽大会
#
2505次浏览
60人参与
#
机械人你知道哪些单休企业
#
83021次浏览
414人参与
#
今年春招是金一银二嘛?
#
7696次浏览
100人参与
#
参加完秋招的机械人,还参加春招吗?
#
103561次浏览
684人参与
#
1月小结:你过的开心吗?
#
1749次浏览
50人参与
#
抛开难度不谈,你最想去哪家公司?
#
3993次浏览
107人参与
#
为什么有人零实习也能进大厂?
#
4781次浏览
116人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
8014次浏览
193人参与
#
没关系,至少我的__很曼妙
#
3613次浏览
63人参与
#
赚钱的意义在这一刻具象化
#
3831次浏览
93人参与
#
你的第一家实习公司是什么档次?
#
4029次浏览
69人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
3525次浏览
126人参与
#
机械人春招想让哪家公司来捞你?
#
379179次浏览
3140人参与
#
你的landing期是如何度过的?
#
8295次浏览
159人参与
#
AI求职实录
#
3154次浏览
97人参与
#
除了Java,最推荐学什么技术?
#
5515次浏览
141人参与
#
一人一道大厂面试题
#
114082次浏览
1263人参与
#
设计人如何选offer
#
187081次浏览
864人参与
#
你在职场上见过哪些“水货”同事
#
30717次浏览
167人参与
#
你觉得什么岗位会被AI替代
#
36713次浏览
255人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务