基于MD5的加盐消息摘要Java实现

2018-03-26 02:14赵一凡卞良丛昕
软件导刊 2018年3期
关键词:字符串明文消息

赵一凡 卞良 丛昕

摘要:

Java是一种面向对象的编程语言,具有良好的跨平台性,其继承、封装、多态的特征能够使程序更加稳定。通过对摘要破解网站的测试,发现短语言实现明文摘要加密,安全性并不高,而加盐消息摘要有助于提高加密安全性。加盐消息摘要保留了MD5算法的优点,通过增加原始明文长度,可解决短明文摘要加密不安全的问题。测试结果表明,加盐消息摘要的安全性较高,加盐后的消息摘要不易被破解网站反查询破解。

关键词:

消息摘要;加盐法;MD5;加密

DOIDOI:10.11907/rjdk.172368

中图分类号:TP312

文献标识码:A文章编号文章编号:16727800(2018)003021403

英文摘要Abstract:Java is an object oriented programming language, has a good crossplatform, its inheritance, encapsulation, multistate features make the program more stable. Through testing the digest to crack the website, we found that the short text is encrypted in plain text is not safe. However, the method with salt can improve the security of the encryption. Salt method to retain the advantages of MD5 algorithm, by increasing the length of the original text to solve the short text summary encryption is not safe. Will be added after the message summary results into the abstract crack site. The results show that the safety of salt method is higher, and the message digest after salt is not easy to be cracked.

英文關键词Key Words:message digest; method with salt; MD5; encryption

0引言

信息技术的快速发展,使资源获取变得越来越便捷,因此人们对身份和信息的完整性、保密性及信息的安全传输极为关注。消息摘要算法是单向散列函数中的一种,它不仅在安全通信中起着重要作用,而且是保障许多密码协议与密码算法安全的基本前提条件。散列算法也称为散列函数、Hash函数、哈希函数、杂凑函数,在现代密码学中扮演着重要角色[1]。Ronald L Rivest在1989年提出了MD2,在1990年提出MD4[2],并在1991年提出针对MD4的改进版本MD5、HAVAL[3]、RIPEMD[4]、RIPEMD-160[5]和SHA-1[6]等。数据加密技术被广泛应用于网络领域,目前常见的摘要算法有MD5、SHA-1等[7]。MD5的主要优点在于其是一种单向、极难逆的字符串变换算法[8],虽然也出现了若干MD5破解算法[9],但大多数为概率性破解,只对部分常见字符串集合有效,所以MD5仍是当前比较安全的算法。给明文信息加密虽然可以保证信息在传输和流通中的可靠性与安全性,但一些破解网站的出现也引发了人们对信息安全性的质疑。通过在破解网站上的反复测试发现,这些所谓的破解网站只能查询常见的短明文摘要。若想解决短明文摘要加密安全性不高的问题,可以增加原始明文长度,即采用加盐法。

1消息摘要技术

消息摘要技术又称为数据摘要、消息摘要算法。消息摘要是从抽取的一组原始数据中抽取唯一特征码的技术,常见的摘要算法有MD5、SHA-1等。MD5算法的基本原理是:以512位分组处理输入字节串的信息,且每一分组又被划分为16个32位子分组,经过一系列处理后,算法的输出由4个32位分组组成,将这4个32位分组级联后将生成一个128位散列值[10]。

1.1消息摘要技术特点

消息摘要技术具有如下特点:①无论输入的数据长度是多少,摘要的结果都是一个固定长度的数据;②消息摘要是单向算法,只能根据数据计算出摘要,而无法将摘要还原成原数据;③相同的数据摘要结果一定相同;④不同数据产生的摘要结果不同,两个数据中即使存在细微差别,产生的摘要也会产生很大不同。因此,数据不同摘要也不同,数据相同摘要一定相同,摘要相同原数据一定相同,消息摘要是一段数据的唯一身份标识。

1.2消息摘要用途

消息摘要具有以下两方面用途:

(1)检验数据完整性。数据的发送方通过网络与数据集及接收方建立连接,发送前事先计算摘要,发送时将数据从起始点发送到目的地,同时将摘要一同发往目的地。数据接收方收到数据后,立即对收到的数据文件进行摘要计算,如果是相同的数据摘要算法,会得到相同的摘要数据,再与发送来的摘要数据进行比较。如果摘要相同,则说明接收到的原始文件数据与发送前无差异;若不同,则意味着数据在发送传输过程中出现了问题。

(2)检验密码一致性。一些商业软件系统出于安全性考虑,不允许使用明文保存用户密码。此时,利用消息摘要既能保证安全性,又能完成一致性检验。消息摘要为单向算法,无法还原成原文,并且与原文具有一对一的唯一对应关系,所以消息摘要是密码存储和一致性检验的理想选择。

2Java消息摘要API使用

Java语言具有良好的跨平台性,可提高执行效率。Java中已经集成了消息摘要API,支持常用的消息摘要算法,只需调用这些API提供的方法即可轻松计算出消息摘要。

Java.security.MessageDigest类使用步骤如下:

(1)创建消息摘要对象(该对象中封装了很多消息摘要算法)。该类是没有构造器的,所以必须使用其工厂方法:

MessageDigest.getInstance("MD5");//给一个算法名,必须是Java消息摘要支持的算法名,如:MD5、SHA等

(2)update(byte[]data){…},它可以将数据提交给消息摘要算法,让算法计算出消息摘要。方法可以多次调用,每调用一次就会将一批数据递交给算法进行计算。如果原始数据非常大,可以分多次调用update。

(3)调用digest()摘要方法,获得最终摘要结果,最终结果为定长(即128位的数,采用二进制数组byte[]数组存储)的数据。

2.1计算字符串的MD5

提交给消息摘要的数据必须是byte类型数据,所以需要利用API将字符串转化为byte数据再进行摘要计算。字符串根据编码转换为byte数据,如果需要了解字符串的编码,可关注Unicode与UTF-8,示例代码如下:

package single_md5;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class StringMD5 {

public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {

//原始明文为“消息摘要”

String plainText="消息摘要";

//将明文转化为一组二进制数组,摘要算法只能针对二进制数组进行转化

byte[] data=plainText.getBytes("utf-8");

//获得Java提供的MD5消息摘要算法

MessageDigest md5=MessageDigest.getInstance("MD5");

//将数据data提交到消息摘要类中计算,如果有很多数据,可以多次提交数据

md5.update(data);

//获取摘要计算结果,结果由16个byte组成,一个128位数据

byte[] digest=md5.digest();

//为了便于查看结果,利用commons-coding程序提供的函数转换为16进制字符串

//每个byte转换为2个16进制字符,一共32个字符

char[] hex=Hex.encodeHex(digest);

System.out.println(hex); //输出摘要结果

}

}

2.2计算文件的MD5

文件本身就是byte数据,只需将文件打开,将数据逐一提交到消息摘要类中,在全部数据提交后即可获取摘要结果,示例代码如下:

package single_md5;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class FileMD5 {

public static void main(String[] args) throws NoSuchAlgorithmException, IOException {

//计算commons-codec-1.3.jar文件的消息摘要

char[] md5=md5Hex(new File("lib/commons-codec-1.3.jar"));

System.out.println(md5);

//计算backup.jar文件的消息摘要

md5=md5Hex(new File("lib/backup.jar"));

System.out.println(md5);

//结果发现这两个文件摘要相同,说明两个文件内容相同,是副本关系

}

public static char[] md5Hex(File file) throws IOException, NoSuchAlgorithmException{

//打开文件

FileInputStream in=new FileInputStream(file);

//創建MD5消息摘要算法对象

MessageDigest md5=MessageDigest.getInstance("MD5");

//讀取文件,将文件中的数据提交到MD5算法中

int n;

byte[] buf=new byte[1024*8]; //8K读取缓冲区

while((n=in.read(buf))!=-1){

//将每次读取的结果分批提交到MD5算法中进行计算

md5.update(buf, 0, n);

}

in.close();

//将全部文件中的数据提交到MD5算法中后,可以获取摘要计算的结果

byte[] digest=md5.digest();

//转换为HEX编码

char[] hex=Hex.encodeHex(digest);

return hex;

}

}

3MD5加密安全性提升

3.1消息摘要破解网站分析

消息摘要是单向算法,明文经过摘要得到的结果是无法还原为原始明文的,但有些网站提供破解服务,并宣称可以根据摘要得到明文。经过在破解网站的反复输入测试,总结消息摘要破解网站的破解能力如下:①MD5消息摘要破解网站存储了大量摘要结果,通过反查询方式进行破解,但无法破解复杂数据;②常用的字母组合可以被破解;③消息摘要网站不可能保存全部摘要技术,因为128位摘要数量极为庞大;④通过对破解网站的测试结果发现,短明文摘要加密是不安全的。

3.2加盐法

若想解决短明文摘要加密安全性不高的问题,可以增加原始明文长度,该方法又称为加盐法。这个“盐”常为字符串数据,将盐与密码一起合并计算摘要,可增加查询破解的难度,从而提升安全性。破解网站的暴力查询破解只能查询常见的短明文的摘要,如果加长原文数据长度,摘要结果则很难查到。

3.3加盐法实现

Java的摘要API可以非常方便地实现加盐算法,但盐的保密非常重要,将盐和明文数据分批提交给MD5对象即可计算出摘要结果,示例代码如下:

package single_md5;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class SaltMD5 {

public static void main(String[] args) {

String salt="加盐";

char[] md5=md5(salt+"123");

System.out.println("加盐MD5"+new String(md5));

md5=md5("123");

System.out.println("MD5:"+new String(md5));

}

private static char[] md5(String plain) {

try {

//创建消息摘要对象

MessageDigest md5=MessageDigest.getInstance("MD5");

//明文提交到消息对象中计算摘要

byte[] data;

data = plain.getBytes("utf-8");

//将明文提交到消息摘要对象中

md5.update(data);

//计算出摘要结果

byte[] digest=md5.digest();

//转换为16进制编码

char[] hex=Hex.encodeHex(digest);

return hex;

} catch (NoSuchAlgorithmException e) {

//算法名错误,是一个不可能发生的异常

e.printStackTrace();

throw new RuntimeException(e);

}catch (UnsupportedEncodingException e) {

//编码名错误,是一个不可能发生的异常

e.printStackTrace();

throw new RuntimeException(e);

}

}

}

4结语

本文在消息摘要理论研究的基础上,针对短明文摘要加密安全性不高的问题,采用加盐法增加原始明文长度,可增加查询破解的难度,并给出了加盐法计算消息摘要的示例代码。加盐法保留了MD5算法的优点,且安全性更高。然而,加密算法的改进同样会促使攻击者计算能力不断提高,因此只有持续对原算法进行改进、扩展,才能使信息传输环境越来越安全。

参考文献参考文献:

[1]张仕斌,万武南,张金全,等.应用密码学[M].西安:西安电子科技大学出版社,2009.

[2]5R Rivest.The MD4 message digest algorithm,request for commentsRFC 1320[EB/OL].[20120414]. http://www. ietf.org/rfc/rfc1320.txt.

[3]ZHENG Y, PIEPRZYK J, SEBERRY J. HAVALa one way hashing algorithm with variable length of output: in advances in cryptologyauscrypt'92 [C].Berlin: Springer, Lecture Notes in Computer Science,1993,718:83104.

[4]RIJMEN V. Cryptanalysis and design of iterated block ciphers[D].Katholieke Universiteit, Doctoral Dissertation, Belgium Leuven, 1997:1115.

[5]DODIS Y, OLIVEIRA R, PIETRZAK K. On the generic insecurity of the full domain hash: advances in cryptologycrypto'2005[C].Berlin Heidelberg: Springer, Lecture Notes in Computer Science,2005,3621:449466.

[6]FIPS PUB 1801. Secure Hash standardSHA1[S].National Institute of Standards and TechnologyNIST, U.S. Department of Commerce, Washington DC,1995.

[7]張裔智,赵毅,汤小斌.MD5算法研究[J].计算机科学,2008,35(7):295297.

[8]陈松,黄炜.MD5算法的FPGA实现[J].信息安全与通信保密,2007(6):129130.

[9]崔国华,周荣华,粟栗.关于MD5强度分析的研究[J].计算机工程与科学,2007,29(1):4548.

[10]陈少晖,翟晓宁,阎娜,等.MD5算法破译过程解析[J].计算机工程与应用,2010,46(19):109110.

责任编辑(责任编辑:黄健)

猜你喜欢
字符串明文消息
奇怪的处罚
奇怪的处罚
四部委明文反对垃圾焚烧低价竞争
消息
消息
消息
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案