Java加密和數(shù)字簽名本文主要談一下密碼學(xué)中的加密和數(shù)字簽名,以及其在java中如何進(jìn)行使用。對密碼學(xué)有興趣的伙伴,推薦看 Bruce Schneier的著作:Applied Crypotography。在jdk1.5的發(fā)行版本中安全性方面有了很大的改進(jìn),也提供了對RSA算法的直接支持,現(xiàn)在我們從實(shí)例入手解決問題(本文僅是作為簡單介紹):
密碼學(xué)上常用的概念
1)消息摘要:
這是一種與消息認(rèn)證碼結(jié)合使用以確保消息完整性的技術(shù)。主要使用單向散列函數(shù)算法,可用于檢驗(yàn)消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的算法有MD4、MD5、SHA-1,jdk1.5對上面都提供了支持,在java中進(jìn)行消息摘要很簡單, java.security.MessageDigest提供了一個簡易的操作方法:
/**
*MessageDigestExample.java
*Copyright 2005-2-16
*/
import java.security.MessageDigest;
/**
*單一的消息摘要算法,不使用密碼.可以用來對明文消息(如:密碼)隱藏保存
*/
public class MessageDigestExample{
public static void main(String[] args) throws Exception{
if(args.length!=1){
System.err.println("Usage:java MessageDigestExample text");
System.exit(1);
}
byte[] plainText=args[0].getBytes("UTF8");
//使用getInstance("算法")來獲得消息摘要,這里使用SHA-1的160位算法
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
System.out.println("\n"+messageDigest.getProvider().getInfo());
//開始使用算法
messageDigest.update(plainText);
System.out.println("\nDigest:");
//輸出算法運(yùn)算結(jié)果
System.out.println(new String(messageDigest.digest(),"UTF8"));
}
}
還可以通過消息認(rèn)證碼來進(jìn)行加密實(shí)現(xiàn),javax.crypto.Mac提供了一個解決方案,有興趣者可以參考相關(guān)API文檔,本文只是簡單介紹什么是摘要算法。
這里補(bǔ)充另一個運(yùn)用消息摘要的方式加密的例子:
public class TestEncrypt {
public TestEncrypt() {
}
/**
* @param strSrc :strSrc is a string will be encrypted,
* @param encName : encName is the algorithm name will be used.
* encName dafault to "MD5"
* @return String
*/
public String Encrypt(String strSrc, String encName) {
MessageDigest md = null;
String strDes = null;
byte[] bt = strSrc.getBytes();
try {
if (encName == null || encName.equals("")) {
encName = "MD5";
}
md = MessageDigest.getInstance(encName);
md.update(bt);
strDes = bytes2Hex(md.digest()); //to HexString
}
catch (NoSuchAlgorithmException e) {
System.out.println("Invalid algorithm.");
return null;
}
return strDes;
}
密碼學(xué)上常用的概念
1)消息摘要:
這是一種與消息認(rèn)證碼結(jié)合使用以確保消息完整性的技術(shù)。主要使用單向散列函數(shù)算法,可用于檢驗(yàn)消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的算法有MD4、MD5、SHA-1,jdk1.5對上面都提供了支持,在java中進(jìn)行消息摘要很簡單, java.security.MessageDigest提供了一個簡易的操作方法:
/**
*MessageDigestExample.java
*Copyright 2005-2-16
*/
import java.security.MessageDigest;
/**
*單一的消息摘要算法,不使用密碼.可以用來對明文消息(如:密碼)隱藏保存
*/
public class MessageDigestExample{
public static void main(String[] args) throws Exception{
if(args.length!=1){
System.err.println("Usage:java MessageDigestExample text");
System.exit(1);
}
byte[] plainText=args[0].getBytes("UTF8");
//使用getInstance("算法")來獲得消息摘要,這里使用SHA-1的160位算法
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
System.out.println("\n"+messageDigest.getProvider().getInfo());
//開始使用算法
messageDigest.update(plainText);
System.out.println("\nDigest:");
//輸出算法運(yùn)算結(jié)果
System.out.println(new String(messageDigest.digest(),"UTF8"));
}
}
還可以通過消息認(rèn)證碼來進(jìn)行加密實(shí)現(xiàn),javax.crypto.Mac提供了一個解決方案,有興趣者可以參考相關(guān)API文檔,本文只是簡單介紹什么是摘要算法。
這里補(bǔ)充另一個運(yùn)用消息摘要的方式加密的例子:
public class TestEncrypt {
public TestEncrypt() {
}
/**
* @param strSrc :strSrc is a string will be encrypted,
* @param encName : encName is the algorithm name will be used.
* encName dafault to "MD5"
* @return String
*/
public String Encrypt(String strSrc, String encName) {
MessageDigest md = null;
String strDes = null;
byte[] bt = strSrc.getBytes();
try {
if (encName == null || encName.equals("")) {
encName = "MD5";
}
md = MessageDigest.getInstance(encName);
md.update(bt);
strDes = bytes2Hex(md.digest()); //to HexString
}
catch (NoSuchAlgorithmException e) {
System.out.println("Invalid algorithm.");
return null;
}
return strDes;
}