发表于: 2016-04-18 21:53:09
1 2184
【操作步骤】
1.完善MD5加密算法,加盐值。参考链接:http://blog.csdn.net/xiaocha2008/article/details/42872195
2.在maven项目中配置并使用Memcache。参考链接:http://www.tuicool.com/articles/Yf2ie2
【知识总结】
1.关于MD5加盐,参考链接:http://www.server110.com/sec_news/201309/995.html
1.1 目的:使密码更安全,增加破解难度。不加盐的话,黑客只要拿到算法,或者使用生日攻击、碰撞攻击等手段,就能很容易地破解用户密码;加盐之后,即使黑客获得了算法,或者采用各种生成密码库的攻击手段,都需要付出大量的时间和精力才能得到密码明文,提高破解难度。
1.2 方法:针对每一个用户U,生成一个随机值Salt,并且在以后永远保持不变,任意两个用户的盐不能相同。然后当用户设置密码的时候,根据明文密码P,计算MD5(P+Salt)=C。而登录的时候用户也给出明文密码P',服务器拿到之后同样计算MD5(P'+Salt)=C',看C'是否等于C。
1.3 效果:使用不加盐的MD5加密算法,如果A、B两个用户都使用了“12345”这个密码,那么保存在数据库里面的A、B两个用户的密码密文也会相同;使用加盐的MD5加密算法,由于盐值是随机的,A、B用户虽然密码明文相同,但盐值不同,加密后的密文就不会相同。
1.3 密码学的应用安全,是建立在破解所要付出的成本远超出能得到的利益上的。
2.一点思考。
在操作步骤1中的那个链接是一个MD5加盐算法,在这个算法中,作者先随机生成盐值,然后对(password+salt)进行MD5加密,然后再把加密后生成的字符串p与加密所用的盐值s混合起来(就是新建一个字符串,使其第一位是p的第一位,第二位是s的第一位,第三位是p的第二位.....),最后混合得到的字符串就是最终的加密结果;当需要验证密码时,先从数据库中提取出密码密文,从密文中先解析出盐值,然后把该盐值和用户输入的密码结合,进行MD5加密,然后再与数据库中的保存的密文进行比较,看是否一致。我在项目中使用的就是这个算法,感觉很好。
关于MD5加密,我看到有人会直接把用户的一些信息(如用户名、账号等)当成盐值用,而且我看到有人说如果使用随机数作盐值的话,需要把盐值也保存在数据库中,以供验证密码时使用,这是当然的。我刚开始觉得这样做会不安全,因为如果被黑客拖库,黑客就获得了用户的盐值,这样再暴力枚举,就能够得到密码明文了,后来一想,因为每个用户的盐值都不一样,黑客就需要对每个用户都暴力枚举一遍,十分费时,所以其实很安全。
总而言之,就是我们不用担心黑客会获得用户的密码密文和盐值,只要每个用户的盐值不同,那么密码就很安全。
3.Memcache包括服务器端和客户端,其中在Java项目应用中,服务器端安装包括libevent、Memcached、magent;客户端一般用memcached client for java。但是由于被墙了,我下载不了magent,不过没关系,magent知识一个代理,没有它一样可以。
4.一系列文章,关于Memcache的,里面关于各参数的含义介绍得很清楚,参考链接:http://blog.csdn.net/xifeijian/article/details/21994941
5.在telnet下给Memcache中添加/删除数据,参考链接:http://blog.csdn.net/jinxingfeng_cn/article/details/24264693和http://www.jb51.net/article/51750.htm
要注意的是,如果我这样写:“set key 0 0 8”表示的意思是我现在给Memcache中添加一个键值对,这个键值对的键是“key”,我刚开始一直在这块有疑问,我以为这样写表示这个键值对的键是“0”,注意,在“set key 0 0 8”这个语句中,只有set是关键字,其余四个都是参数。
6.当我往Memcache中存储了一对键值对后,我好像逐渐理解了Memcache的作用了,我们在和数据库交互时,都会把需要返回的数据以键值对的形式存进Memcache中,以供下次快速获取。
7.在启动Memcache服务时,有一个IP参数和端口参数,刚开始我一直以为这里的IP参数和端口参数要和项目的参数一致(就是说,假如我用Jetty启动了项目ITtask_4,此时项目的IP和端口就是localhost:8080,我以为Memcache也必须将IP和端口设为localhost:8080),我把Memcache理解为项目的监控服务了。其实不是这样的,Memcache应该理解为一个独立的服务,它的任务就是存储数据,所以应该把它看成一个独立的程序,IP和端口不必和程序一致,而且也不能一致。
【出现的问题(已解决)】
【出现的问题(未解决)】
1.在项目中使用MemCachedClient类时出现了问题。
我是这样在Maven项目中配置Memcache的:
1.1 首先在pom.xml中添加Memcached-Java-Client部件,配置如下:
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.0</version>
</dependency>
关于这一块,我看到有人在引用com.danga:memcached这个包,但是要想引用这个包需要自己下载,我用了上面com.whalin这个包,不用自己下载,maven就会自己下载。
1.2 然后我编写了一个memcache.properties,这个配置文件里面有Memcached服务器的一些参数(如server、failOver、initConn等)。
1.3 我编写了一个memcached-content.xml文件,在这个文件里面主要是在配置"com.whalin.MemCached.SockIOPool"这个类,其中调用了我在memcache.properties中配置的一些参数。
1.4 然后就是在Controller类中调用了,调用方法如下:
1.5 问题来了,我在Controller类中新建的那个MemCachedClient类mc很正常,它的参数和我在memcache.properties中配置的参数完全吻合,但是我的model里面的键值对的value是null,表明没有存入值,原因不明。
老大,我上面的步骤基本正确吧,我看到有些文章上是在一个util类中配置SockIOPool的参数的,我感觉那种方法和我这种方法一样的,我也试过那种方法,结果还是会出问题,model中的键值对为null,不知道是什么原因。
【疑问】
1.理论上来说我是不是可以这样做,假如我的项目配置在服务器上后IP是1.1.1.1,在这个程序中我建立了一个Memcache服务,这个Memcache服务的IP是2.2.2.2,就是说程序本体所在的服务器和Memcache所在的服务器不一样,可以这样吗?
评论