发表于: 2018-05-20 22:36:08
1 1435
今天完成的事情:
深度思考:
1. 什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?
cookie是一种在客户端记录用户信息的技术,因为http协议是无状态的,为了解决这个问题而产生了cookie。记录用户名等一些应用
session是一种在服务端记录用户信息的技术,一般session用来在服务器端共享数据
cookie的工作原理?session的工作原理?
cookie工作原理,可以看下面讲解cookie的那张图,cookie是由服务器端创建发送回浏览器端的,并且每次请求服务器都会将cookie带过去,以便服务器知道该用户是哪一个。其cookie中是使用键值对来存储信息的,并且一个cookie只能存储一个键值对。所以在获取cookie时,是会获取到所有的cookie,然后从其中遍历。
session的工作原理就是依靠cookie来做支撑,第一次使用request.getSession()时session被创建,并且会为该session创建一个独一无二的sessionid存放到cookie中,然后发送会浏览器端,浏览器端每次请求时,都会带着这个sessionid,服务器就会认识该sessionid,知道了sessionid就找得到哪个session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。
如果对cookie和session还有不理解的地方,用大家肯定都会用,就是需要理解,为什么需要使用cookie和session,,cookie和session只是为了解决http协议无状态的这种缺陷,为了记录用户信息,记录浏览器和服务器之间的状态和衍生出来的。
Cookie应用场景
判断注册用户是否已经登录网站:用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录流程。
根据用户的爱好定制内容:网站创建包含用户浏览内容的cookies,在用户下次访问时,网站根据用户的情况对显示的内容进行调整,将用户感兴趣的内容放在前列。
实现永久登录:如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。
实现自动登录:当用户注册网站后,就会收到一个惟一用户ID的cookie。用户再次连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否是注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。
使用cookie记录各个用户的访问计数:获取cookie数组中专门用于统计用户访问次数的cookie的值,将值加1并将最新cookie输出。
使用cookie记住用户名与用户密码。用户勾选了“自动登录”,就把用户名和密码的信息放到cookie中。同时可设置有效期。
用cookie实现新手大礼包等弹窗功能。同理,将新手大礼包弹窗逻辑写入到cookie中,并设置相应的有效期。比如在有效期内只弹出一次该弹窗,超过有效期登录后再次弹出弹窗。
Session应用场景
1.通过session累计用户数据。例如,一个未登录用户访问了京东网站,这个时候京东对其下发了一个 cookie,假设cookie的名字叫做abc,那这条记录就是 abc=001,同时京东的后台也生成了一个 session id, 它的值也为 001, 001 这个客户在 2 点、 3 点、 4 点分别添加了三件商品到购物车,这样后台也记录了 session id 为 001的用户的购物车里面已经有三件商品,并且只要每次客户端 cookie 带上来的值里面包含session id,后台都能够展示相应的数据,如果这个时候,在浏览器里面清空 cookie,cookie 数据消失之后,后台和客户端无法建立对应关系,购物车的数据就会失效了。
2.通过session实现单点登录。一个用户帐号成功登录后,在该次session还未失效之前,不能在其他机器上登录同一个帐号。登录后将用户信息保存到session中,如果此时在另外一台机器上一个相同的帐号请求登录,通过遍历(遍历的意思就是将所有session都查看一遍)Web服务器中所有session并判断其中是否包含同样的用户信息,如果有,在另一台机器上是不能登录该帐号的。
2. 拦截器、过滤器、监听器各有什么作用?
监听器
Servlet监听器是指这样的实例对象,首先它实现了Servlet规范中定义的某些Listener接口,然后由Servlet容器实例化,并在整个web application生命周期中监听某些事件,对监听到的事件调用相应的方法进行处理。
Servlet监听器主要包括ServletContextListener、HttpSessionListener、ServletRequestListener这三大类监听器。
ServletContextListener 负责监听Servlet上下文(亦即整个web application)的创建/销毁事件
HttpSessionListener 负责监听Session会话的创建/销毁事件
ServletRequestListener 负责监听用户请求的发起/返回事件。
当这些事件发生时,会自动触发已注册的监听器实例来进行相应处理。
Servlet监听器需要在web项目的web.xml文件中注册,或者使用@WebListener注解。
除了上面的三大类监听器,Servlet API中还定义了其他更细分的监听器,比如HttpSessionActivationListener、ServletContextAttributeListener等等。
过滤器
Servlet过滤器负责过滤用户对web资源的请求,并在返回Response前做一些自定义的操作。同监听器一样,Servlet过滤器必须要先实现Filter接口,然后在web.xml中注册,并由Servlet容器来实例化。它的生命周期同样是整个web application的运行时。
过滤用户对web资源的请求,这听起来有点像ServletRequestListener监听器的功能,都是捕获请求并执行处理。但二者要处理的事情其实是不同的,监听器监听到Request请求后,要做的处理是与web application相关的Servlet上下文,并不能处理ServletRequest与ServletResponse;而过滤器则正是对用户的请求与返回进行加工处理。
过滤器需要在web项目的web.xml配置文件中注册,或者使用@WebFilter注解。
另外,除了默认的对用户Request请求进行过滤的过滤器外,根据web.xml中定义的过滤器的<dispatcher>,Servlet过滤器还有如下几种类型:
拦截器
拦截器的作用有点类似于过滤器,同样都是在整个web application生命周期内捕获用户请求事件,然后进行处理。他们二者之间的区别在于:
1.检查spring mvc项目的web.xml配置就可以看到,过滤器<filter>跟<servlet>是同级别的,一个web application可以有一个或者多个servlet来负责处理不同的url mapping,spring mvc的基础DispatcherServlet就是一个servlet,拦截器是定义在DispatcherServlet的上下文中的。所以处理顺序是 用户访问 –> 过滤器 –> DispatcherServlet –> 过滤器 –> 返回
2.过滤器的作用范围比拦截器大。
明天计划的事情:
开始重构代码了
遇到的问题:
收获:
前端MD5加密:
前端MD5加密的作用是让中间人看不到明文的隐私信息, 但是挡不住重放攻击, 中间人将加密后的密文重新发回即可破解.
它的作用是如果中间人只嗅探不改包,那么他只能拿到密文,只能用于这一个网站登录。对于不同网站使用同密码的用户来说,能提高一点安全性。
解决方法: 从服务器传个 token 下来浏览器,提交的时候拿 token 当做盐来算 md5 。登录成功后这个 token 便失效,这样避免重放攻击。
什么是对称密码算法:
网络安全通信中要用到两类密码算法,一类是对称密码算法,另一类是非对称密码算法。对称密码算法有时又叫传统密码算法、秘密密钥算法或单密钥算法,非对称密码算法也叫公开密钥密码算法或双密钥算法。对称密码算法的加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密。
对称算法又可分为两类。一次只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组位进行运算,这些位组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64位――这个长度既考虑到分析破译密码的难度,又考虑到使用的方便性。后来,随着破译能力的发展,分组长度又提高到128位或更长。
常用的采用对称密码术的加密方案有5个组成部分(如图所示):
1)明文:原始信息。
2)加密算法:以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。
3)密钥:加密与解密算法的参数,直接影响对明文进行变换的结果。
4)密文:对明文进行变换的结果。
5)解密算法:加密算法的逆变换,以密文为输入、密钥为参数,变换结果为明文。
对称密码常用的数学运算:
对称密码当中有几种常用到的数学运算。这些运算的共同目的就是把被加密的明文数码尽可能深地打乱,从而加大破译的难度。
移位和循环移位:
移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时,把数码的最后的位移到数码的最前头,循环左移正相反。例如,对十进制数码12345678循环右移1位(十进制位)的结果为81234567,而循环左移1位的结果则为23456781。
置换:
就是将数码中的某一位的值根据置换表的规定,用另一位代替。它不像移位操作那样整齐有序,看上去杂乱无章。这正是加密所需,被经常应用。
扩展:
就是将一段数码扩展成比原来位数更长的数码。扩展方法有多种,例如,可以用置换的方法,以扩展置换表来规定扩展后的数码每一位的替代值。
压缩:
就是将一段数码压缩成比原来位数更短的数码。压缩方法有多种,例如,也可以用置换的方法,以表来规定压缩后的数码每一位的替代值。
异或:
这是一种二进制布尔代数运算。异或的数学符号为⊕ ,它的运算法则如下:
1⊕1 = 0
0⊕0 = 0
1⊕0 = 1
0⊕1 = 1
也可以简单地理解为,参与异或运算的两数位如相等,则结果为0,不等则为1。
迭代:
迭代就是多次重复相同的运算,这在密码算法中经常使用,以使得形成的密文更加难以破解。
DES算法
DES是Data Encryption Standard(数据加密标准)的缩写。它是由IBM公司研制的一种对称密码算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,三十年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,而且可以任意时候改变。其中有极少数被认为是易破解的弱密钥,但是很容易避开它们不用。所以保密性依赖于密钥。
DES加密的算法框架如下:
首先要生成一套加密密钥,从用户处取得一个64位长的密码口令,然后通过等分、移位、选取和迭代形成一套16个加密密钥,分别供每一轮运算中使用。
DES对64位(bit)的明文分组M进行操作,M经过一个初始置换IP,置换成m0。将m0明文分成左半部分和右半部分m0 = (L0,R0),各32位长。然后进行16轮完全相同的运算(迭代),这些运算被称为函数f,在每一轮运算过程中数据与相应的密钥结合。
在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的48位数据,再将其压缩置换成32位。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。
经过16轮迭代后,左,右半部分合在一起经过一个末置换(数据整理),这样就完成了加密过程。
加密流程如图所示 :
DES解密过程:
在了解了加密过程中所有的代替、置换、异或和循环迭代之后,读者也许会认为,解密算法应该是加密的逆运算,与加密算法完全不同。恰恰相反,经过密码学家精心设计选择的各种操作,DES获得了一个非常有用的性质:加密和解密使用相同的算法!
DES加密和解密唯一的不同是密钥的次序相反。如果各轮加密密钥分别是K1,K2,K3…K16,那么解密密钥就是K16,K15,K14…K1。这也就是DES被称为对称算法的理由吧。
DES算法的安全性和发展:
DES的安全性首先取决于密钥的长度。密钥越长,破译者利用穷举法搜索密钥的难度就越大。目前,根据当今计算机的处理速度和能力,56位长度的密钥已经能够被破解,而128位的密钥则被认为是安全的,但随着时间的推移,这个数字也迟早会被突破。
另外,对DES算法进行某种变型和改进也是提高DES算法安全性的途径。
例如后来演变出的3-DES算法使用了3个独立密钥进行三重DES加密,这就比DES大大提高了安全性。如果56位DES用穷举搜索来破译需要2∧56次运算,而3-DES 则需要2∧112次。
又如,独立子密钥DES由于每轮都使用不同的子密钥,这意味着其密钥长度在56位的基础上扩大到768位。DES还有DESX、CRYPT、GDES、RDES等变型。这些变型和改进的目的都是为了加大破译难度以及提高密码运算的效率
DES IP置换 : 明文的初始置换,有一个初始置换表
DES实现实例: https://blog.csdn.net/u010924845/article/details/51018702
DES实现原理: https://blog.csdn.net/android_jiangjun/article/details/79654940
BASE64 处理: https://blog.csdn.net/big1989wmf/article/details/70144803
任务进度:task5
任务开始时间:2018年5月15日
预计demo时间:2018年5月21日
是否延期:
延期理由:
评论