趙一凡 卞良 叢昕
摘要:
Java是一種面向?qū)ο蟮木幊陶Z言,具有良好的跨平臺性,其繼承、封裝、多態(tài)的特征能夠使程序更加穩(wěn)定。通過對摘要破解網(wǎng)站的測試,發(fā)現(xiàn)短語言實現(xiàn)明文摘要加密,安全性并不高,而加鹽消息摘要有助于提高加密安全性。加鹽消息摘要保留了MD5算法的優(yōu)點,通過增加原始明文長度,可解決短明文摘要加密不安全的問題。測試結(jié)果表明,加鹽消息摘要的安全性較高,加鹽后的消息摘要不易被破解網(wǎng)站反查詢破解。
關(guān)鍵詞:
消息摘要;加鹽法;MD5;加密
DOIDOI:10.11907/rjdk.172368
中圖分類號:TP312
文獻(xiàn)標(biāo)識碼: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.
英文關(guān)鍵詞Key Words:message digest; method with salt; MD5; encryption
0引言
信息技術(shù)的快速發(fā)展,使資源獲取變得越來越便捷,因此人們對身份和信息的完整性、保密性及信息的安全傳輸極為關(guān)注。消息摘要算法是單向散列函數(shù)中的一種,它不僅在安全通信中起著重要作用,而且是保障許多密碼協(xié)議與密碼算法安全的基本前提條件。散列算法也稱為散列函數(shù)、Hash函數(shù)、哈希函數(shù)、雜湊函數(shù),在現(xiàn)代密碼學(xué)中扮演著重要角色[1]。Ronald L Rivest在1989年提出了MD2,在1990年提出MD4[2],并在1991年提出針對MD4的改進(jìn)版本MD5、HAVAL[3]、RIPEMD[4]、RIPEMD-160[5]和SHA-1[6]等。數(shù)據(jù)加密技術(shù)被廣泛應(yīng)用于網(wǎng)絡(luò)領(lǐng)域,目前常見的摘要算法有MD5、SHA-1等[7]。MD5的主要優(yōu)點在于其是一種單向、極難逆的字符串變換算法[8],雖然也出現(xiàn)了若干MD5破解算法[9],但大多數(shù)為概率性破解,只對部分常見字符串集合有效,所以MD5仍是當(dāng)前比較安全的算法。給明文信息加密雖然可以保證信息在傳輸和流通中的可靠性與安全性,但一些破解網(wǎng)站的出現(xiàn)也引發(fā)了人們對信息安全性的質(zhì)疑。通過在破解網(wǎng)站上的反復(fù)測試發(fā)現(xiàn),這些所謂的破解網(wǎng)站只能查詢常見的短明文摘要。若想解決短明文摘要加密安全性不高的問題,可以增加原始明文長度,即采用加鹽法。
1消息摘要技術(shù)
消息摘要技術(shù)又稱為數(shù)據(jù)摘要、消息摘要算法。消息摘要是從抽取的一組原始數(shù)據(jù)中抽取唯一特征碼的技術(shù),常見的摘要算法有MD5、SHA-1等。MD5算法的基本原理是:以512位分組處理輸入字節(jié)串的信息,且每一分組又被劃分為16個32位子分組,經(jīng)過一系列處理后,算法的輸出由4個32位分組組成,將這4個32位分組級聯(lián)后將生成一個128位散列值[10]。
1.1消息摘要技術(shù)特點
消息摘要技術(shù)具有如下特點:①無論輸入的數(shù)據(jù)長度是多少,摘要的結(jié)果都是一個固定長度的數(shù)據(jù);②消息摘要是單向算法,只能根據(jù)數(shù)據(jù)計算出摘要,而無法將摘要還原成原數(shù)據(jù);③相同的數(shù)據(jù)摘要結(jié)果一定相同;④不同數(shù)據(jù)產(chǎn)生的摘要結(jié)果不同,兩個數(shù)據(jù)中即使存在細(xì)微差別,產(chǎn)生的摘要也會產(chǎn)生很大不同。因此,數(shù)據(jù)不同摘要也不同,數(shù)據(jù)相同摘要一定相同,摘要相同原數(shù)據(jù)一定相同,消息摘要是一段數(shù)據(jù)的唯一身份標(biāo)識。
1.2消息摘要用途
消息摘要具有以下兩方面用途:
(1)檢驗數(shù)據(jù)完整性。數(shù)據(jù)的發(fā)送方通過網(wǎng)絡(luò)與數(shù)據(jù)集及接收方建立連接,發(fā)送前事先計算摘要,發(fā)送時將數(shù)據(jù)從起始點發(fā)送到目的地,同時將摘要一同發(fā)往目的地。數(shù)據(jù)接收方收到數(shù)據(jù)后,立即對收到的數(shù)據(jù)文件進(jìn)行摘要計算,如果是相同的數(shù)據(jù)摘要算法,會得到相同的摘要數(shù)據(jù),再與發(fā)送來的摘要數(shù)據(jù)進(jìn)行比較。如果摘要相同,則說明接收到的原始文件數(shù)據(jù)與發(fā)送前無差異;若不同,則意味著數(shù)據(jù)在發(fā)送傳輸過程中出現(xiàn)了問題。
(2)檢驗密碼一致性。一些商業(yè)軟件系統(tǒng)出于安全性考慮,不允許使用明文保存用戶密碼。此時,利用消息摘要既能保證安全性,又能完成一致性檢驗。消息摘要為單向算法,無法還原成原文,并且與原文具有一對一的唯一對應(yīng)關(guān)系,所以消息摘要是密碼存儲和一致性檢驗的理想選擇。
2Java消息摘要API使用
Java語言具有良好的跨平臺性,可提高執(zhí)行效率。Java中已經(jīng)集成了消息摘要API,支持常用的消息摘要算法,只需調(diào)用這些API提供的方法即可輕松計算出消息摘要。
Java.security.MessageDigest類使用步驟如下:
(1)創(chuàng)建消息摘要對象(該對象中封裝了很多消息摘要算法)。該類是沒有構(gòu)造器的,所以必須使用其工廠方法:
MessageDigest.getInstance("MD5");//給一個算法名,必須是Java消息摘要支持的算法名,如:MD5、SHA等
(2)update(byte[]data){…},它可以將數(shù)據(jù)提交給消息摘要算法,讓算法計算出消息摘要。方法可以多次調(diào)用,每調(diào)用一次就會將一批數(shù)據(jù)遞交給算法進(jìn)行計算。如果原始數(shù)據(jù)非常大,可以分多次調(diào)用update。
(3)調(diào)用digest()摘要方法,獲得最終摘要結(jié)果,最終結(jié)果為定長(即128位的數(shù),采用二進(jìn)制數(shù)組byte[]數(shù)組存儲)的數(shù)據(jù)。
2.1計算字符串的MD5
提交給消息摘要的數(shù)據(jù)必須是byte類型數(shù)據(jù),所以需要利用API將字符串轉(zhuǎn)化為byte數(shù)據(jù)再進(jìn)行摘要計算。字符串根據(jù)編碼轉(zhuǎn)換為byte數(shù)據(jù),如果需要了解字符串的編碼,可關(guān)注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="消息摘要";
//將明文轉(zhuǎn)化為一組二進(jìn)制數(shù)組,摘要算法只能針對二進(jìn)制數(shù)組進(jìn)行轉(zhuǎn)化
byte[] data=plainText.getBytes("utf-8");
//獲得Java提供的MD5消息摘要算法
MessageDigest md5=MessageDigest.getInstance("MD5");
//將數(shù)據(jù)data提交到消息摘要類中計算,如果有很多數(shù)據(jù),可以多次提交數(shù)據(jù)
md5.update(data);
//獲取摘要計算結(jié)果,結(jié)果由16個byte組成,一個128位數(shù)據(jù)
byte[] digest=md5.digest();
//為了便于查看結(jié)果,利用commons-coding程序提供的函數(shù)轉(zhuǎn)換為16進(jìn)制字符串
//每個byte轉(zhuǎn)換為2個16進(jìn)制字符,一共32個字符
char[] hex=Hex.encodeHex(digest);
System.out.println(hex); //輸出摘要結(jié)果
}
}
2.2計算文件的MD5
文件本身就是byte數(shù)據(jù),只需將文件打開,將數(shù)據(jù)逐一提交到消息摘要類中,在全部數(shù)據(jù)提交后即可獲取摘要結(jié)果,示例代碼如下:
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);
//結(jié)果發(fā)現(xiàn)這兩個文件摘要相同,說明兩個文件內(nèi)容相同,是副本關(guān)系
}
public static char[] md5Hex(File file) throws IOException, NoSuchAlgorithmException{
//打開文件
FileInputStream in=new FileInputStream(file);
//創(chuàng)建MD5消息摘要算法對象
MessageDigest md5=MessageDigest.getInstance("MD5");
//讀取文件,將文件中的數(shù)據(jù)提交到MD5算法中
int n;
byte[] buf=new byte[1024*8]; //8K讀取緩沖區(qū)
while((n=in.read(buf))!=-1){
//將每次讀取的結(jié)果分批提交到MD5算法中進(jìn)行計算
md5.update(buf, 0, n);
}
in.close();
//將全部文件中的數(shù)據(jù)提交到MD5算法中后,可以獲取摘要計算的結(jié)果
byte[] digest=md5.digest();
//轉(zhuǎn)換為HEX編碼
char[] hex=Hex.encodeHex(digest);
return hex;
}
}
3MD5加密安全性提升
3.1消息摘要破解網(wǎng)站分析
消息摘要是單向算法,明文經(jīng)過摘要得到的結(jié)果是無法還原為原始明文的,但有些網(wǎng)站提供破解服務(wù),并宣稱可以根據(jù)摘要得到明文。經(jīng)過在破解網(wǎng)站的反復(fù)輸入測試,總結(jié)消息摘要破解網(wǎng)站的破解能力如下:①MD5消息摘要破解網(wǎng)站存儲了大量摘要結(jié)果,通過反查詢方式進(jìn)行破解,但無法破解復(fù)雜數(shù)據(jù);②常用的字母組合可以被破解;③消息摘要網(wǎng)站不可能保存全部摘要技術(shù),因為128位摘要數(shù)量極為龐大;④通過對破解網(wǎng)站的測試結(jié)果發(fā)現(xiàn),短明文摘要加密是不安全的。
3.2加鹽法
若想解決短明文摘要加密安全性不高的問題,可以增加原始明文長度,該方法又稱為加鹽法。這個“鹽”常為字符串?dāng)?shù)據(jù),將鹽與密碼一起合并計算摘要,可增加查詢破解的難度,從而提升安全性。破解網(wǎng)站的暴力查詢破解只能查詢常見的短明文的摘要,如果加長原文數(shù)據(jù)長度,摘要結(jié)果則很難查到。
3.3加鹽法實現(xiàn)
Java的摘要API可以非常方便地實現(xiàn)加鹽算法,但鹽的保密非常重要,將鹽和明文數(shù)據(jù)分批提交給MD5對象即可計算出摘要結(jié)果,示例代碼如下:
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 {
//創(chuàng)建消息摘要對象
MessageDigest md5=MessageDigest.getInstance("MD5");
//明文提交到消息對象中計算摘要
byte[] data;
data = plain.getBytes("utf-8");
//將明文提交到消息摘要對象中
md5.update(data);
//計算出摘要結(jié)果
byte[] digest=md5.digest();
//轉(zhuǎn)換為16進(jìn)制編碼
char[] hex=Hex.encodeHex(digest);
return hex;
} catch (NoSuchAlgorithmException e) {
//算法名錯誤,是一個不可能發(fā)生的異常
e.printStackTrace();
throw new RuntimeException(e);
}catch (UnsupportedEncodingException e) {
//編碼名錯誤,是一個不可能發(fā)生的異常
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
4結(jié)語
本文在消息摘要理論研究的基礎(chǔ)上,針對短明文摘要加密安全性不高的問題,采用加鹽法增加原始明文長度,可增加查詢破解的難度,并給出了加鹽法計算消息摘要的示例代碼。加鹽法保留了MD5算法的優(yōu)點,且安全性更高。然而,加密算法的改進(jìn)同樣會促使攻擊者計算能力不斷提高,因此只有持續(xù)對原算法進(jìn)行改進(jìn)、擴展,才能使信息傳輸環(huán)境越來越安全。
參考文獻(xiàn)參考文獻(xiàn):
[1]張仕斌,萬武南,張金全,等.應(yīng)用密碼學(xué)[M].西安:西安電子科技大學(xué)出版社,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].計算機科學(xué),2008,35(7):295297.
[8]陳松,黃煒.MD5算法的FPGA實現(xiàn)[J].信息安全與通信保密,2007(6):129130.
[9]崔國華,周榮華,粟栗.關(guān)于MD5強度分析的研究[J].計算機工程與科學(xué),2007,29(1):4548.
[10]陳少暉,翟曉寧,閻娜,等.MD5算法破譯過程解析[J].計算機工程與應(yīng)用,2010,46(19):109110.
責(zé)任編輯(責(zé)任編輯:黃?。?