當前位置:
首頁 > 知識 > Java加密與解密

Java加密與解密


  1. 密碼學介紹

網路是不安全的,信息可能隨時被竊取或者身份被冒用。提到安全離不開密碼學。密碼學在古代就已經存在,古典的密碼學需要保密加密演算法,而現代的密碼學的加密演算法是公開的,信息的安全性由密鑰來保證。

對稱加密演算法:加密和解密的秘鑰是相同的,常見的演算法有DES,AES,IDEA等。對稱加密演算法最重要的問題秘鑰的可靠傳輸問題。

非對稱加密演算法:加密和解密的秘鑰不同,常見的演算法有RSA,DH,EIGamal等。非對稱加密演算法有一個公鑰和一個私鑰,公鑰是用來發布的,私鑰保密。通信發送方使用公鑰加密,接收方使用私鑰解密。不存在秘鑰傳輸問題,但是非對稱加密演算法的運算效率比對稱加密演算法低很多。

消息摘要:也叫數字指紋,是用來驗證消息完整性的。常用的演算法有MD5,SHA-1,MAC等。

數字簽名:用來認證消息來源,驗證消息的完整性及消息的不可否認性。常用的演算法有MD5withRSA,SHA1withRSA等。

數字證書:也稱電子證書,用於標識網路中的用戶。數字證書具備加密/解密必要的信息,及簽名演算法,簽發機構,有效期,簽發者等信息。用來驗證消息,認證用戶身份,加解密數據。

HTTPS:HTTPS是基於SSL/TLS的HTTP協議。有單向認證 和雙向認證,單向認證僅需要伺服器提供證書,驗證伺服器證書;雙向認證在伺服器提供證書的前提下,要求客戶端提供客戶證書,同時驗證伺服器和客戶身份。

  1. 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:笑月天狼 |