MD5加密算法
标签(空格分隔): 加密算法 MD5 BASE64
Java实现MD5加密算法
在如今各种应用中,都需要用户名和密码登录。如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存。那么,什么是MD5加密算法呢?MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。
它是是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。
MD5是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述,这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。
一)消息摘要简介
一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。消息摘要是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1。
消息摘要有两个基本属性:
两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而可以由该报文反推算出该指定的摘要
代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5
对信息系统或者网站系统来说,MD5算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:
- 在线查询密码。一些在线的MD5值查询网站提供MD5密码值的查询,输入MD5密码值后,如果在数据库中存在,那么可以很快获取其密码值。
- 使用MD5破解工具。网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。
- 通过社会工程学来获取或者重新设置用户的口令。
因此简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对MD5进行改造,增强其安全性,本文就是在MD5加密算法的基础上进行改进!
1.对字符串进行加密:
public static final String KEY_MD5 = "MD5";
/**
* MD5加密算法
* @param data
* @return
* @throws NoSuchAlgorithmException
*/
public static byte[] encryptMD5(String data) throws NoSuchAlgorithmException {
byte[] inputData = data.getBytes();
if (data == null){
return null;
}else {
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(inputData);
return md5.digest();
}
}
这样的加密目前容易被破解,目前流行的趋势是加密后得到的byte再进行BASE64加密:
/**
* BASE64加密算法
* @param data
* @return
*/
public static String encryptBASE64(byte[] data){
//byte[] inputdate = data.getBytes();
String encode = new BASE64Encoder().encode(data);
return encode;
}
/**
* BASE64解密算法
* @param data
* @return
* @throws IOException
*/
public static byte[] decryptBASE64(String data) throws IOException {
byte[] code = new BASE64Decoder().decodeBuffer(data);
return code;
}
BASE64 严格地说,属于编码格式,而非加密算法.
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
测试结果:
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
MyEncrypt myEncrypt = new MyEncrypt();
String name = "zt110e5";
byte[] code1 = myEncrypt.encryptMD5(name);
byte[] code4 = myEncrypt.encryptMD5(name);
System.out.println("一次MD5加密后结果:"+code1);
System.out.println("一次MD5加密后结果:"+code4);
String code2 = myEncrypt.encryptBASE64(code1);
String code5 = myEncrypt.encryptBASE64(code1);
System.out.println("二次BASE64加密结果:"+code2);
System.out.println("二次BASE64加密结果:"+code5);
boolean b = checkData("zt110e5","AR/qvREz5KIPECCnOGHmBw==");
System.out.println(b);
}
控制台打印:
一次MD5加密后结果:[B@677327b6
一次MD5加密后结果:[B@14ae5a5
二次BASE64加密结果:AR/qvREz5KIPECCnOGHmBw==
二次BASE64加密结果:AR/qvREz5KIPECCnOGHmBw==
AR/qvREz5KIPECCnOGHmBw==
true