Java加密與解密
密碼學介紹
網路是不安全的,信息可能隨時被竊取或者身份被冒用。提到安全離不開密碼學。密碼學在古代就已經存在,古典的密碼學需要保密加密演算法,而現代的密碼學的加密演算法是公開的,信息的安全性由密鑰來保證。
對稱加密演算法:加密和解密的秘鑰是相同的,常見的演算法有DES,AES,IDEA等。對稱加密演算法最重要的問題秘鑰的可靠傳輸問題。
非對稱加密演算法:加密和解密的秘鑰不同,常見的演算法有RSA,DH,EIGamal等。非對稱加密演算法有一個公鑰和一個私鑰,公鑰是用來發布的,私鑰保密。通信發送方使用公鑰加密,接收方使用私鑰解密。不存在秘鑰傳輸問題,但是非對稱加密演算法的運算效率比對稱加密演算法低很多。
消息摘要:也叫數字指紋,是用來驗證消息完整性的。常用的演算法有MD5,SHA-1,MAC等。
數字簽名:用來認證消息來源,驗證消息的完整性及消息的不可否認性。常用的演算法有MD5withRSA,SHA1withRSA等。
數字證書:也稱電子證書,用於標識網路中的用戶。數字證書具備加密/解密必要的信息,及簽名演算法,簽發機構,有效期,簽發者等信息。用來驗證消息,認證用戶身份,加解密數據。
HTTPS:HTTPS是基於SSL/TLS的HTTP協議。有單向認證 和雙向認證,單向認證僅需要伺服器提供證書,驗證伺服器證書;雙向認證在伺服器提供證書的前提下,要求客戶端提供客戶證書,同時驗證伺服器和客戶身份。
Java Security API
Java Security API提供了可互操作的演算法和安全服務的實現。服務以provider的形式實現,可以以插件的形式植入應用程序中。Java.security.Provider抽象了Java security provider。它指定了provider的名字,羅列了它實現的安全服務。多個provider可能同時被配置,他們會以優先順序排列。當一個安全服務收到請求,這個服務的最高優先順序的provider提供服務。
JCA(java Cryptography Arthitecture):提供訪問和開發密碼功能的框架,如證書,數字簽名,消息摘要和秘鑰對產生器。
JCE(Java Cryptography Extension):擴展包,提供用於加密,密鑰生成和協商以及Message Authentication Code(MAC)演算法的框架和實現。它提供對對稱,不對稱,塊和流密碼的加密支持,它還支持安全流和密封的對象。
JSSE(Secure Sockets Layer):提供基於SSL的安全套接字層加密功能。
下面是關於API的用法示例:
消息摘要:
SHA-1和MD5加密為例:
/**
* SHA和MD5消息摘要
*/
public class TestSHA {
private static final char[] CH_HEX = {"0","1","2","3","4","5","6","7","8","9","A",
"B","C","D","E","F"};
public static void main(String[] args) {
String str = "ceshi";
try {
String encrty = encodeBySHA(str.getBytes("utf-8"));
System.out.println(encrty);
System.out.println(encrty.length());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encodeBySHA(byte[] data) throws Exception{
// MessageDigest md = MessageDigest.getInstance("MD5");
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] result = md.digest(data);
return byteArrayToHex(result);
}
/**
* 將位元組數組轉化為16進位字元串
* @param bytes
* @return
*/
private static String byteArrayToHex(byte[] bytes){
// 一個位元組佔8位,一個十六進位字元佔4位;十六進位字元數組的長度為位元組數組長度的兩倍
char[] chars = new char[bytes.length*2];
int index = 0;
for(byte b:bytes){
//取位元組的高4位
chars[index++] = CH_HEX[b>>>4 & 0xf];
//取位元組的低4位
chars[index++] = CH_HEX[b & 0xf];
}
return new String(chars).toUpperCase();
}
}
SHA結果為:
加密結果:0FF58845367298B9346506748C588E1969C44360
加密長度:40
MD5結果為:
加密結果:CC17C30CD111C7215FC8F51F8790E0E1
加密長度:32
MD5與SHA比較:
MD5和SHA都是不可逆的加密演算法。
由於MD5與SHA-1均是從MD4發展而來,它們的結構和強度等特性有很多相似之處, SHA-1與MD5的最大區別在於其摘要比MD5摘要長32 比特。對於強行攻擊,產生任何一個報文使之摘要等於給定報文摘要的難度:MD5是2128數量級的操作,SHA-1是2160數量級的操作。產生具有相同摘要的兩個報文的難度:MD5是264是數量級的操作,SHA-1 是280數量級的操作。因而,SHA-1對強行攻擊的強度更大。但由於SHA-1的循環步驟比MD5多80:64且要處理的緩存大160比特:128比特,SHA-1的運行速度比MD5慢
後續會介紹其它加密方法


※Java加密與解密——非對稱加密
※Java加密解密——數字簽名
※數據泵導入導出資料庫
※oracle插入時如何自動生成主鍵
TAG:笑月天狼 |