发表于: 2020-06-18 22:37:00
1 1882
任务五深度思考:
1.JWT简单介绍
JSON Web Token(缩写 JWT)是一种跨域认证解决方案。
JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。
{
"姓名": "张三",
"角色": "管理员",
"到期时间": "2018年7月1日0点0分"
}
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
2.拦截器、过滤器、监听器各有什么作用?
Filter
Filter是一个可重复使用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一资源的响应。
Listener
Listener是监听器,通过Listener可以监听Web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的来说就是在Application,Session,Request三个对象创建、消亡或者往其中添加、修改、删除属性时自动执行代码功能的组件。
Interceptor
Interceptor是拦截器,在JavaWeb中主要是面向切面编程时使用,一般在调用一个方法前亦或是调用一个方法后执行该Interceptor拦截器中的方法。在JavaWeb中应用拦截器,比如说我们想得知一个完整请求的响应时间,我们就可以通过添加拦截器的方式,在请求开始前记录一个开始时间,在请求结束后,记录一个结束时间,用结束时间减去开始时间,即可获取该次请求所消耗的时间。这样以来就可以更加方便我们对于程序的优化处理。
3.什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?
明文(plaintext)是加密之前的原始数据,密文是通过密码(cipher)运算后得到的结果成为密文(ciphertext)
为什么不能存明文?
a,防内贼
b,防拖库,泄露所有的密码
c,密文泄露了短时间内也无法破译出明文
4.Cookie的失效时间怎么设定?最大允许存放多少字节?
设定 maxAge(-1 浏览器关闭即清空,0 失效, 正数 有效时间单位为秒)
最大 4K 即 4096 Bytes
5.在App中没有Cookie,怎么解决用户身份识别的问题?Token应该放在什么位置?怎么在后端设计的时候,又支持Cookie,又支持Token?
用 token。
token 放在 url 后面作为参数、写入 header 或者 post主体。
没有搜索到怎么做到同时支持 cookie 与 token,一拍脑袋自己想一个,就是 cookie 里面也存上 token,拦截器拦截到有 cookie 就校验 cookie 里的 token,否则就校验 url 或者 header 里面的 token。
6.什么叫加盐?加盐能解决什么问题?通常的加盐方式有哪些?
加密明文之前往密文掺杂一些随机字符串的方式称为加盐。
解决的问题:
a,相同的明文密码加密后密文一致
b,一般的密文可能被查表破解
加盐的方式:
a,加密前生成随机字符串与密码一起加密,数据库存储密文与盐值
b,使用 BCrypt,加密的时候密文即带盐,不用另外存储盐值
7.什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
虽然无法直接从密文还原明文,但是相同的明文 md5 之后密文相同,有可能通过查表的方式破解。
8.拦截器是什么?为什么要配置拦截器?拦截器里通常应该校验什么,怎么做到统一配置拦截器,让必须登录才能使用的接口,判断用户未登录时,返回错误信息?
为什么要配置拦截器?
拦截器体现了 面向切面编程的思想,经常需要对很多请求做同样的处理,拦截器可以在请求到达 controller 、view 的前后三处时间点对请求进行处理,这些处理我们也可以写在 controller 里面,拦截器是对这类操作的一个抽象。
在配置文件中配置拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/check.html"/>
<beanclass="cn.mogeek.util.LoginInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mappingpath="/u/**"/>
<beanclass="cn.mogeek.util.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
然后实现 HandlerInterceptor 接口写好对应的操作。
9.Https是什么?怎么配置Https证书,哪些请求需要Https,登录是否需要Https?
超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
所有隐私数据的传输都应该使用 https,登录也应该使用 https。
10.什么是对称加密,什么是非对称加密?分别适用于什么场景?
对称加密:加解密用同一个密钥。
非对称加密:公钥加密只有私钥能解开。
对称加密速度快,密钥可以短一点,常用的场景有文件加密。
非对称加密公私钥在数学上相关联,需要密钥长一点,加解密速度比较慢。常见应用有邮件加密。
11.Token的构造规则是什么,怎么确认用户身份的,怎么保证Token被偷窃的问题?
Token 没有具体的构造规则,不过现在讲 token 应该都指的是 JWT 规范的 token。
JWT 规范:
JWT token 分为三段:header、payload、signature
Header 指定加密方式,token 类型
Payload 是载荷,用来校验的部分
Signature 是对前两者的签名,用来给服务器校验数据没有被修改
需要注明的是 JWT 规范中并不对 payload 与 header 进行严格加密,数据可以被第三方读取,不宜存入隐私信息。
如果 jwt 类型的 token 被盗,服务器是校验不出来是否被盗的,按照规范服务器会一直通过这个 token 的请求,所以说 jwt 规范并不是用来做安全认证的,它能做到的就是确认这个 token 的内容有没有被篡改。
当然后端可以做一些其他的事情,比如 token 加入时间戳,超过 2 秒即失效。减少被盗用的风险。
12.Cookie是在Http的什么位置存放,Cookie里的键可以重复吗?
F12 看了一下,存储在 http 响应头的 cookie 字段里面。
键可以重复,只要除了value、maxAge之外的参数不完全重复 cookie 就不会被覆盖。
13.什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?
session: 会话,内容存储在服务器上,session id 一般存储在 cookie 里,可以以放在 url 后面。
cookie:服务器给客户端下发的一小段文本,存储在客户端,安全性主要由客户端保证。
内容小,隐私性强的信息保存在 session 比较好。其他的可以放在 cookie 里。
今天花了比较多的功夫比较 jwt 与 cookie-session 的优劣,目前我看到的有以下几点比较重要:
优点:
a,token 的方式不会被浏览器自动塞到请求里,也就没有了 CSRF 校验的需求了。
b,苹果手机浏览器、原生应用不支持 cookie,当然我们也可以用 session,但是 session 需要服务器存储,token 不用,服务器只做校验与分发。
特性(或者说缺点):
a,客户端的每个 token 都需要自己加密后发出来
b,token 内部不能存储隐私信息(就像 cookie 一样),即使加密也比不上 session 的安全性,session 也许会被利用,但永不会被泄露。
c,一旦分发出去,除非过期或者服务器增加拦截的逻辑,否则无法使其失效。
评论