发表于: 2020-07-05 16:27:05

1 1834


今天完成的事情:完成深度思考。
明天计划的事情:任务六
遇到的问题:暂无
收获:

1.JWT简单介绍 ?

JWT即Json Web Token,是为了在网路应用环境中传递声明的一种基于Json的开放标准,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

传统session认证和token的区别

Session认证:由于Http连接是无状态的,我们如果需要保存用户信息,不用重复登录,就需要把用户信息进行保存下来,方便下次识别判断。传统session就是在服务器保存用户登录的信息,也会响应到浏览器,保存为cookie.但是session的使用会暴露相关问题,1)每个用户经过认证后就需要保存在服务端,session又是放在内存中,用户增多,肯定会增加服务端开销很大。2)不适合扩展,在分布式负载均衡的时候,还是都要去保存用户信息的服务器获取信息。3)cookie保存在客户端,传输中有可能被截获,受到跨站请求伪造攻击。

Token:用户使用用户名密码来请求服务器,服务器进行验证用户的信息,验证后发送给用户一个token,客户端存储token,并在每次请求时附送上这个token值,服务端验证token值,并返回数据。

这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *

JWT由三段构成:头部(header)+载荷(payload)+签证(signature).

header两部分信息:声明类型typ和声明加密的算法alg,通常使用HMAC SHA256

{

 "typ": "JWT"

 "alg": "HS256"
}

playload:载荷就是存放有效信息的地方,其实也是个json对象。包括三部分,标准中注册的声明,公共的声明,私有的声明。

标准声明

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间

jti (JWT ID):编号

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret');




私有声明

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true}

signature(签名,防篡改),由header (base64后的)+payload (base64后的)+secret(将前两个信息加盐)得到的。

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret');

secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。

得到最终的token就是把 Header,Payload Signature 三个部分拼成字符串,每个部分用 . 隔开  ,放在 Cookie 里面不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面返回。

Authorization: Bearer <token>

JWT优点就是:支持跨语言支持,结构简单,字节传输小,不需要再服务的保存会话信息,易于扩展。

最大的缺点是:由于服务器不保存 session 状态。因此无法在使用过程中废除某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

JWT 本身包含了认证信息,一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用,有效期应该设置比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证,不应该使用 HTTP 明码传输,要使用 HTTPS 协议传输。

2.拦截器、过滤器、监听器各有什么作用?

Filter(过滤器)

就是过滤器,依赖Servlet容器,实现上基于函数回调,几乎对所有的请求进行过滤,过滤器的实例每次只在容器初始化时调用一次。主要用途是过滤字符编码,做一些业务逻辑判断,过滤器随 web 应用启动而启动。

 Filter 的使用:

(1)在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest,根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。

(2)创建Filter 处理类,init方法、destory方法、doFilter方法,并在web.xml 文件中配置Filter

Interceptor(拦截器)

依赖于web框架,在Spring中依赖于SpringMVC框架。实现上基于java反射机制,AOP的运用。

通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,重写preHandle()、postHandle()和afterCompletion()来对用户的请求进行拦截处理

执行顺序:监听器>过滤器>拦截器

Listener按照监听器可以分为三种类型:ServletContextListener 监听ServletContext对象,HttpSessionListener 监听Session对象,HttpRequestListener 监听Request对象

统计在线人数,利用HttpSessionListener;加载初始化信息,利用ServletContextListener,统计网站访问量实现访问监控。

3.什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?

存在相关的安全隐患,如果被别人攻击了或者数据库失窃,都会导致密码泄露,再加上用户其他手机号,身份证信息都可能导致窃密者跑到其他网站进行尝试,因为用户有可能设置相关性很大的密码,造成更大的损失。

4.Cookie的失效时间怎么设定?最大允许存放多少字节? 

setMaxAge()

默认4kb,20个cookie。

有些浏览器能够存放的cookie也是有数量限制的。

5.在App中没有Cookie,怎么解决用户身份识别的问题?Token应该放在什么位置?怎么在后端设计的时候,又支持Cookie,又支持Token?

使用 Token 进行验证,Token 存持久化到硬盘或数据库中。编写多个不同的拦截器对来自不同客户端的请求进行不同的处理,接受Cookie的和Token的。

6.什么叫加盐?加盐能解决什么问题?通常的加盐方式有哪些? 

盐(Salt)就是一个随机生成的字符串,每次修改密码或者操作,都会生成新的随机字符串,将原始密码进行哈希算法之后,进行加盐,就是把随机字符串混入到密码哈希值中,再将这个值再次进行哈希算法计算,这样生成的密文就更安全了。

加盐能防止用户密码直接存储在数据库中,防止泄露。

 破解的常用方法有暴力破解和字典破解,也是最笨拙的方法,就是一个一个试。所以二者的破解方法在时间(速度)和空间(存储)上都需要很大的资源,这样破解密码的效率极低。

还有彩虹表进行反向推出你的密码,彩虹表中是一些常用的固定长度的纯文本的哈希值,当这张表越大,破解密码的机率就越大。所以对于使用哈希算法加密的方式也就不那么安全了。如果被加密的原文不是固定的,那样彩虹表就很难进行哈希码对照了。也就更安全了。

7.什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密? 

md5是一种信息摘要算法,它可以从一个字符串或一个文件中按照一定的规则生成一个特殊的字符串(这个特殊的字符串就被称之为摘要,我理解就是从文件中摘一些信息片段加工而来),并且一个文件所对应的MD5摘要是固定的,当文件内容变化后,其MD5值也会不一样(虽然理论上来说也有可能会一样,但概率极小),因此,在应用中经常使用MD5值来验证一段数据有没有被篡改。

用作加盐算法。

因为MD5碰撞性,一个MD5值可能对应多个原始数据。暴力破解意见字典破解和彩虹表仍然有可能破解。

8.拦截器是什么?为什么要配置拦截器?拦截器里通常应该校验什么,怎么做到统一配置拦截器,让必须登录才能使用的接口,判断用户未登录时,返回错误信息?

拦截器用于对URL请求进行前置/后置过滤,Interceptor与Filter相似,但实现方式不一样,拦截器是SpringMVC的组件,底层是基于Sring AOP面向切面编程实现,运行在springIOC容器。拦截器里进行校验用户登录的信息,token,cookie等。配置统一拦截器,需要先在applicationContext中配置拦截器的地址。

<mvc:interceptors>
       <mvc:interceptor>
              <!--/**是对所有请求路径以及子路经进行拦截-->
       <mvc:mapping path="/**"/>
             <!--这儿需要注意,拦截器拦截全部请求的话会把包括静态资源请求也拦截到,
       如果对某些静态资源不拦截可以配置exclude-mapping-->
       <mvc:exclude-mapping path="/css/**"/>
              <mvc:exclude-mapping path="/img/**"/>
              <mvc:exclude-mapping path="/pic/**"/>
              <bean class="com.hyx.interceptor.MyInterceptor"></bean>
       </mvc:interceptor>
</mvc:interceptors>

然后在自定义类实现HandlerInterceptor接口 ,在preHandle方法中配置 - 前置执行处理

9.Https是什么?怎么配置Https证书,哪些请求需要Https,登录是否需要Https?

Https即Http+SSL,HTTPS并不是一个单独的应用层协议,而只是Http使用SSL通道进行数据传输的过程。那么对于Https, 只需要了解Http(参考HTTP详解)和SSL协议即可。而所谓的HTTPS报文也就是SSL报文。

对于支付,金融要求安全性高的请求以及相关的用户登录信息需要Https.

配置 Https

1)Nginx 安装 ssl 模块

Nginx 默认安装的情况下ssl模块并未被安装,如果要使用该模块则需要在编译 nginx 时指定 –with-http_ssl_module 参数.

安装后

server {

    listen 443 ssl;

    server_name www.****.com;#域名

    ssl_certificate /root/project/ssl/nginx.crt;#证书路径

    ssl_certificate_key /root/project/ssl/nginx.key;#key路径

    ssl_session_cache shared:SSL:1m; #s储存SSL会话的缓存类型和大小

    ssl_session_timeout 5m; #会话过期时间

    #...

}

启用 https,将http访问自动跳转到https

server{

    listen 80 www.****.com;

    rewrite ^/(.*)$ https://www.****.com/$1 permanent;

}

10.什么是对称加密,什么是非对称加密?分别适用于什么场景?

加密算法种类:单向加密、对称加密、非对称加密

单向加密:

1)Base64:从二进制到字符的过程,用 64 个字符来表示任意的二进制数据,常用于 HTTP 加密,图片编码传输等

可打印字符:在 ASCII 码中规定,0-31、128这个33个字符属于控制字符,32-127 这95个字符属于可打印字符

转换方式:在 HTTP 协议下传输二进制数据时需要将其转换为字符数据,而网络传输只能传输可打印字符(95个),不能转换的就需要使用 Base64 进行转换

2)MD5:一般用于确保信息的传输完整一致性,校验传输的数据是否被修改,一旦原始信息被修改,生成的 MD5 值回表的很不同

3)SHA 家族:是一个密码三列函数家族,是 FIPS 所认证的安全三列算法。跟 MD5 类似,都是对文本进行散列,产生一定长度的散列值

对称加密:对称加密的意思就是信息收发都有相同的一把钥匙,消息的加密解密都用这进行

DES:数据加密标准,速度较快。适用于加密大量数据的场合

非对称加密:一种密钥的保密方法。非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密,如果用私钥对数据进行加密,那么只有用对应的公钥才能解密

RSA:这种算法非常可靠,密钥越长破解越难

11.Token的构造规则是什么,怎么确认用户身份的,怎么保证Token被偷窃的问题?

token构造就是JWT的规则。通过拦截器,判断存储在cookie中的token值是否一致。

偷窃问题
1.可以将SessionId加密后作为Token,通过对比链接的SessionId来验证

2.可以将用户设备的MAC地址加密后作为Token,对比请求设备的MAC号来验证

12.Cookie是在Http的什么位置存放,Cookie里的键可以重复吗?

存放在Http的header中,键是不能重复的。

13.什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?

Cookie

Cookie是Web服务器保存在客户端的小文本文件,里面包含了用户相关信息。Cookie默认时效是很和Session,即一个会话关闭后失效,当然也可以自己设置时间。执行路程是,客户端发送一个HTTP请求到服务器,服务器接受请求后,响应给客户端响应头中的Set-Cookie就是Cookie信息,浏览器保存Cookie,当浏览器第二次访问服务器时,会携带Cookie信息到服务器,识别后更新Cookie再次返回到浏览器保存。

Session

Session是对于服务端来说的,Session是一个会话,是服务器和客户端建立连接时添加的一个客户端连接标志,最终在服务器软件转化为一个临时的Cookie发送给客户端,当客户端第一次请求服务器时,会检查是否携带了这个Session(临时Cookie),如果没有则会添加Session,如果有就拿出这个Session来做相关操作。

为什么会出现Session?

因为Http是无状态的,每次访问都是从新发送新的请求,请求间没有任何联系,例如为了方便我们在一个网页登录后,进入相关网页不需要从新登录,当然只用Cookie也可以,但是因为Cookie是存储在客户端的,用户可见,并且可以随意修改,并不安全,Session存储服务器就弥补了安全问题。



返回列表 返回列表
评论

    分享到