《MD5和AES在项目中的使用方式与区别》
一、加密算法MD5
概述:MD5 是一种用于确保信息的完整性的摘要算法。 特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
二、AES加密算法
概述:是最常见的对称加密算法,通过秘钥进行加密,解密时也必须通过秘钥进行解密。AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。
特点:
1、运算速度快。
2、 对内存的需求非常低,适合于受限环境。
3、分组长度和密钥长度设计灵活。
4、 AES标准支持可变分组长度,分组长度可设定为32比特的任意倍数,最小值为128比特,最大值为256比特。
5、 AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的。
6、很好的抵抗差分密码分析及线性密码分析的能力。
三、项目应用展示
根据项目需求:
为保证数据的安全性,对于数据库存的也不能真实的信息,进行加密
在jfinal框架,Kit中提供HashKit类中有的加密算法,Base64Kit编码算法,AesKit类加密算法等
import com.jfinal.kit.AesKit; import com.jfinal.kit.Base64Kit; import com.jfinal.kit.HashKit;
在本项目中登录密码存放在数据库存放的是加密后的,(数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。 具体再jfinal框架中的使用如下所示
user.setLoginPassword(HashKit.md5(newPwd));
在页面显示的数据,为了保证安全性也会采用加密的方式,比如用户在数据库的id【所以使用AES加密和解密,使用encrypt是加密,decrypt是解密,其中还使用了Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。】
AES将密码加密:先用aesKit解码,然后base64Kit解码【编码格式】 String pwd = Base64Kit.encode(AesKit.encrypt(user.getLoginPassword(), AEC_KEY));
int userid = Integer.parseInt(AesKit.decryptToStr(Base64Kit.decode(id), AEC_KEY));
总结:在项目中的体现MD5和AES最大的区别是:
MD5是单向的,只能保证加密的之后的不会重复但不能解密,在只需要加密保存数据,不需要解密的时候就使用像这种加密方式为宜。
AES是双向的,既支持加密也支持解密,在有的时候,需要加密也需要解密的时候就需要使用这种对称加密算法。
