淺析單向加密算法
單向加密又稱(chēng)為不可逆加密算法,在加密過(guò)程中不使用密鑰,明文由系統(tǒng)加密處理成密文,密文無(wú)法解密。一般適合于驗(yàn)證,在驗(yàn)證過(guò)程中,重新輸入明文,并經(jīng)過(guò)同樣的加密算法處理,得到相同的密文并被系統(tǒng)重新認(rèn)證。廣泛使用于口令加密。

該算法有如下特點(diǎn):
1.對(duì)同一消息反復(fù)執(zhí)行加密得到相同的密文。
2.加密算法生成的密文不可預(yù)見(jiàn),根明文沒(méi)任何關(guān)系。
3.明文的任何微小的變化都會(huì)對(duì)密文產(chǎn)生很大影響。
4.不可逆,即不能通過(guò)密文獲取明文。
比較流行的加密算法:MD5和SHA。
MD5:MessageDigest Algorigthm 5(信息摘要算法),MD5被廣泛應(yīng)用于各種軟件密碼認(rèn)證和鑰匙識(shí)別,如軟件序列號(hào)。
Java使用MD5加密:
package com.security.example.example3;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncrypWithMD5 {
/**
* @param args
*/
public static void main(String[] args) {
// 要加密的字符串
String msg = "java安全編程之單向加密MD5";
System.out.println("原文是:" + msg);
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(msg.getBytes());
byte[] encrypMsg = md.digest();
System.out.println("加密后是:" + new String(encrypMsg));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出:
原文是:java安全編程之單向加密MD5
加密后是:斧A蒮X2_娂弒懠抯
反復(fù)執(zhí)行得到的密文都是這個(gè)。
MD5比較廣泛的應(yīng)用于口令管理,用戶(hù)在注冊(cè)后密碼被經(jīng)過(guò)MD5加密后保存在數(shù)據(jù)庫(kù),這樣即使是數(shù)據(jù)庫(kù)管理員也沒(méi)法知道密碼是什么。
用戶(hù)登陸系統(tǒng)的時(shí)候,系統(tǒng)將用戶(hù)的密碼經(jīng)過(guò)MD5加密與數(shù)據(jù)庫(kù)中保存的密文對(duì)比,一致則通過(guò),這樣就能保證在不知道用戶(hù)密碼的情況下驗(yàn)證用戶(hù)的合法性。
SHA:安全散列算法(Secure Hash Algorithm),對(duì)長(zhǎng)度不超過(guò)264位的二進(jìn)制消息產(chǎn)生160位的消息摘要輸出。
Java使用SHA算法加密:
package com.security.example.example3;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncrypWithSHA {
/**
* @param args
*/
public static void main(String[] args) {
// 要加密的字符串
String msg = "java安全編程之單向加密SHA";
System.out.println("原文是:" + msg);
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA");
md.update(msg.getBytes());
byte[] encrypMsg = md.digest();
System.out.println("加密后是:" + new String(encrypMsg));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出:
原文是:java安全編程之單向加密SHA
加密后是:Z?Vm川V1穽R__fuK挪
反復(fù)允許,結(jié)果也一樣。
Java實(shí)現(xiàn)消息驗(yàn)證碼
單向加密算法生成的消息摘要可以驗(yàn)證數(shù)據(jù)完整性。但是,如果數(shù)據(jù)在傳輸過(guò)程中被竊取者竊取,修改消息并重新生成摘要,將改過(guò)的數(shù)據(jù)和摘要一起發(fā)送給接收者,那這樣接收者是無(wú)法判斷數(shù)據(jù)是否被修改過(guò)。因?yàn)榻邮照吒鶕?jù)接收到的消息產(chǎn)生的摘要與竊取者提供的消息摘要一致。那么,為了數(shù)據(jù)安全性,就需要知道發(fā)送方的身份,消息驗(yàn)證碼一定程度上可以提供此功能(MAC)。
MAC:消息驗(yàn)證碼(Message Authentication Code,MAC)。
MAC 基于秘密密鑰提供一種方式來(lái)檢查在不可靠介質(zhì)上進(jìn)行傳輸或存儲(chǔ)的信息的完整性。通常,消息驗(yàn)證碼在共享秘密密鑰的兩個(gè)參與者之間使用,以驗(yàn)證這兩者之間傳輸?shù)男畔ⅰ?/p>
基于加密哈希函數(shù)的 MAC 機(jī)制也叫作 HMAC。結(jié)合秘密共享密鑰,HMAC 可以用于任何加密哈希函數(shù)(如 MD5 或 SHA-1)。
生成摘要時(shí),發(fā)送方和接受方擁有相同的密鑰,可以通過(guò)對(duì)稱(chēng)算法生成事先被雙方所有。
Java實(shí)現(xiàn)消息驗(yàn)證碼:
package com.security.example.example3;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class MAC {
public static void main(String[] args) {
try {
// 要加密的文本
String msg = "Java安全編程——實(shí)現(xiàn)消息驗(yàn)證碼";
System.out.println("原文:" + msg);
Mac mac = Mac.getInstance("HMACMD5");
// 用給定的密鑰初始化此 Mac 對(duì)象。
// SecretKeySpec為Key的實(shí)現(xiàn)類(lèi)之一
// 如何構(gòu)造SecretKeySpec?
// SecretKeySpec(byte[] key,String algorithm),key:密鑰的密鑰內(nèi)容(原始密鑰)。algorithm:算法
// 怎么得到密鑰?KeyGenerator
// 使用DES算法得到計(jì)算驗(yàn)證碼的密鑰
KeyGenerator kg = KeyGenerator.getInstance("DES");
// 對(duì)稱(chēng)密鑰
SecretKey sk = kg.generateKey();
// 原始密鑰
byte[] encodedMsg = sk.getEncoded();
SecretKeySpec sks = new SecretKeySpec(encodedMsg,"HMACMD5");
// 用給定的密鑰初始化
mac.init(sks);
// 處理給定的字節(jié)數(shù)組
mac.update(msg.getBytes());
// 計(jì)算驗(yàn)證碼(完成MAC)
byte[] encrypMsg = mac.doFinal();
System.out.println("密文:" + new String(encrypMsg));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
重復(fù)執(zhí)行得到的密文都不一樣,因?yàn)槊看蜠ES生成的密鑰不一樣。
實(shí)際中,DES密鑰保存在文件或數(shù)據(jù)庫(kù)中,每次從中取出這樣保證得到的結(jié)果是一樣的。得不到密鑰,當(dāng)然也沒(méi)法生成正確的消息驗(yàn)證碼。






