“用户登陆”之MD5加密

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StarsionBlog/article/details/72078712

一、前言

众所周知,我们在网络中传送一些数据时,会有被窃听的风险。因此,我们需要对需要保密的数据进行加密,才能保证数据不被泄露。而加密的方式有两种,一种是对客户端和服务端整个通信信道进行保护加密,如https协议中的SSL,还有另一种加密是对通信数据本身进行加密,如MD5,这边文章主要将MD5在用户登陆功能中的应用。



二、存在的问题

在过去的开发中,比如对用户密码的加密,笔试是直接用MD5在后台对客户端传送过来的用户密码进行加密后存储在数据库中。虽然用MD5加密后,是不能逆向解密得到明文密码,但是现在网上有所谓的在线解密MD5加密的密文,其原理是收集用户常用的简单密码形成了一个密码字典,并将字典中的密码用MD5加密后存储起来,在所谓的“解密“的时候,就将真正用户密码加密都的密文与已存储的密码相比较,如该密文存在于字典当中,即可以“解密”。因此,简单的用MD5对用户密码加密还不安全。

1.“解密”演示

1.1对简单的密码用MD5加密,如123,



1.2对简单密码加密的密文进行“解密”


从上图中可看出,由于123比较简单,所以可以被“解密”


1.3对复杂的密码用MD5加密,如asfdas123sadfds,



1.4对复杂密码加密的密文进行“解密”



对于复杂的密码来说,“解密”的难度就大大增加了



三、解决办法

下面笔者用实际的java代码来演示如何对用户密码进行正确的MD5加密

1.首先看下数据库中user表单的字段


其中的数据是笔试做测试的时候插入的用例,除了比较熟悉的uid、username、password、head-url(用户头像url)外还有个属性salt,接下来详细讲解下salt

2.salt属性的作用

2.1首先看下salt如何生成

user.setSalt(UUID.randomUUID().toString().substring(0,5));

这行代码是网user实体里加入salt,从中可以看出salt是通过UUID的静态方法randomUUID来获得5位的随机字符串(若要使密码更加复杂,可以将随机字符串设置成更多位)

2.2利用salt对密码进行复杂化

user.setPassword(MD5.getMD5(password+user.getSalt()));

通过这行代码可以看出,后台对密码进行存储之前,先将密码这段字符串加上salt这段字符串,再进行MD5加密,这样子就可以使得存储在数据库的密码变得更复杂,使得所谓的“解密”变得极为困难。

3.登陆如何验证

在登陆的时候可以先通过用户的账号(唯一标识)来获得该用户的salt,然后将用户的密码加上salt进行MD5加密,最后用加密的结果和数据库中保存的结果进行比较,若一样,则匹配成功,反之则不成功。







猜你喜欢

转载自blog.csdn.net/StarsionBlog/article/details/72078712