发表于: 2020-02-10 20:34:22
1 1290
1.JWT简单介绍
JWT 全称 JSON Web Tokens ,是一种规范化的 token。可以理解为对 token 这一技术提出一套规范,是在 RFC 7519 中提出的。
1. 组成
一个 JWT token 是一个字符串,它由三部分组成,头部、载荷与签名,中间用 . 分隔,例如:xxxxx.yyyyy.zzzzz
头部(header)
头部通常由两部分组成:令牌的类型(即 JWT)和正在使用的签名算法(如 HMAC SHA256 或 RSA.)。
载荷(Payload)
载荷中放置了 token 的一些基本信息,以帮助接受它的服务器来理解这个 token。同时还可以包含一些自定义的信息,用户信息交换。
签名(Signature)
签名时需要用到前面编码过的两个字符串,加密后再进行 base64url 编码最后得到的字符串就是 token 的第三部分 zzzzz。组合便可以得到 token:xxxxx.yyyyy.zzzzz。签名的作用:保证 JWT 没有被篡改过
2.拦截器、过滤器、监听器各有什么作用?
过滤器Filter
Servlet过滤器是在java servlet规范2.3中定义的,他能够对servlet容器的请求和响应对象进行检查和修改。
Servlet过滤器本身并不产生请求和响应对象,他只能提供过滤作用,servlet过滤能够在servlet被调用之前检查request对象,修改request的header和request内容,在调用后检查response对象,修改response的头和内容。
Servlet过滤负责过滤的web组件可以是servlet,jsp或html文件。
我们常常使用过滤器来拦截servlet请求
作用:查询请求并作出相应的行动,阻塞请求和响应,修改请求头和请求体,自定义请求,修改响应头和响应体,自定义响应,与外部资源进行交互.
拦截器Interceptor
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式:
第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;
第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
拦截器也是切面编程的一种实现,过滤下来的url请求做一些拦截操作。
监听器Listener
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。下面将介绍几种常用的监听器,以及它们都适合运用于那些环境。
3.什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?
密文,明文,是密码学的术语。明文,是指没有加密的文字(或者字符串),一般人都能看懂的意思。密文,是指经过某个加密算法,把一个明文,变成另一些文字。数据库里面如果保存明文的话,如果数据库被脱库,用户密码就会泄露,而数据库里面如果保存密文,就算数据库被盗,用户密码也不会泄露。
4.Cookie的失效时间怎么设定?最大允许存放多少字节?
Servlet可以通过设置Cookie类的setMaxAge( int expiry ); 最大允许存放4kb也就是4096字节(b)
5.在App中没有Cookie,怎么解决用户身份识别的问题?Token应该放在什么位置?怎么在后端设计的时候,又支持Cookie,又支持Token?
使用token,将token放在头部
6.什么叫加盐?加盐能解决什么问题?通常的加盐方式有哪些?
我们理想中的绝对安全的系统大概是这样的:
1.首先保障数据很难被拖库。
2.即使数据被拖库,攻击者也无法从中破解出用户的密码。
3.即使数据被拖库,攻击者也无法伪造登录请求通过验证。
4.即使数据被拖库,攻击者劫持了用户的请求数据,也无法破解出用户的密码。
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。
7.什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5碰撞通常用于登陆密码的破解。应用系统的数据库中存储的用户密码通常都是原密码的MD5哈希值,每当用户登录时,验签过程如下:
如果我们得到了用户ABC的密码哈希值E10ADC3949BA59ABBE56E057F20F883E,并不需要还原出原密码123456,只需要“碰撞”出另一个原文654321(只是举例)即可。登录时,完全可以使用654321作为登陆密码,欺骗过应用系统的验签。
MD5碰撞的方法有很多,主要包括暴力枚举法、字典法、彩虹表法等等。
8.拦截器是什么?为什么要配置拦截器?拦截器里通常应该校验什么,怎么做到统一配置拦截器,让必须登录才能使用的接口,判断用户未登录时,返回错误信息?
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截器是AOP的一种实现。
9.Https是什么?怎么配置Https证书,哪些请求需要Https,登录是否需要Https?
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
10.什么是对称加密,什么是非对称加密?分别适用于什么场景?
对称加密是双方拥有相同的密钥,非对称加密是双方拥有对方的公钥,加密的时候用对方的公钥加密。对称加密性能好,安全性低,非对称加密性能低,安全性高。
12.Cookie是在Http的什么位置存放,Cookie里的键可以重复吗?
cookie在http头部,不能重复
13.什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?
基于服务器验证方式暴露的一些问题
1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。
3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。
4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。
在这些问题中,可扩展性是最突出的。
因此基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。
这种概念解决了在服务端存储信息时的许多问题
NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。
基于Token的身份验证的过程如下:
1.用户通过用户名和密码发送请求。
2.程序验证。
3.程序返回一个签名的token 给客户端。
4.客户端储存token,并且每次用于每次发送请求。
5.服务端验证token并返回数据。
实现思路
1.用户登录校验,校验成功后就返回Token给客户端。
2.客户端收到数据后保存在客户端
3.客户端每次访问API是携带Token到服务器端。
4.服务器端采用拦截器校验。校验成功则返回请求数据,校验失败则返回错误码
评论