Java加密解密瞭解

席潤發表於2019-02-22

慕課課程《Java實現Base64加密》學習筆記

打字越來越溜~

密碼常用術語

明文:待加密資訊。

密文:經過加密後的明文。

加密:明文轉為密文的過程。

加密演算法:明文轉為密文的轉換演算法。

加密金鑰:通過加密演算法進行加密操作用的金鑰。

解密:將密文轉為明文的過程。

解密演算法:密文轉為明文的演算法。

解密金鑰:通過解密演算法進行解密操作用的金鑰。

密碼分析:截獲密文者試圖通過分析截獲的密文從而推斷出原來的密文或金鑰的過程。

主動攻擊:攻擊者非法入侵密碼系統,採用偽造、修改、刪除等手段向系統注入假訊息進行欺騙。(對密文具有破壞作用)

被動攻擊:對一個保密系統採取截獲密文並對其進行分析和攻擊。(對密文沒有破壞作用)

密碼體制:由明文空間、密文空間、金鑰空間、加密演算法和解密演算法五部分構成。

密碼協議:也稱安全協議,指以密碼學為基礎的訊息交換的通訊協議,目的是在網路環境中提供安全的服務。

密碼系統:指用於加密、解密的系統。

柯克霍夫原則:資料的安全基於金鑰而不是演算法的保密。即系統的安全取決於金鑰,對金鑰保密,對演算法公開。——現代密碼學設計的基本原則。

密碼分類

按時間

古典密碼:以字元為基本加密單元。

現代密碼:以資訊塊為基本加密單元。

按保密內容演算法

名稱 詳細說明 應用領域 類別
受限制演算法 演算法的保密性基於保護演算法的祕密 軍事領域 古典密碼
基於金鑰演算法 演算法的保密性基於對金鑰的保密 現代密碼

按密碼體制

名稱 別名 詳細說明
對稱密碼 單鑰密碼或私鑰密碼 指加密金鑰與解密金鑰相同
非對稱密碼 雙鑰密碼或公鑰密碼 指加密金鑰與解密金鑰不同,金鑰分公鑰、私鑰
對稱密碼演算法 單鑰密碼演算法或私鑰密碼演算法 指應用於對稱密碼的加密、解密演算法
非對稱密碼演算法 雙鑰密碼演算法或公鑰密碼演算法 指對應於非對稱密碼的加密、解密演算法

按明文處理方法

分組加密:指加密時將明文分成固定長度的組,用同一金鑰和演算法對每一塊加密,輸出也是固定長度的密文。多用於網路加密。

流密碼:也稱序列密碼。指加密時每次加密一位或者一個位元組明文。

雜湊函式

用來驗證資料的完整性

特點:長度不受限制、雜湊值容易計算、雜湊運算過程不可逆

相關演算法:訊息摘要演算法MD5等、SHA——安全雜湊演算法、MAC ——訊息認證碼演算法

數字簽名

主要是針對以數字的形式儲存的訊息進行的處理

OSI安全體系

OSI(Open System Interconnection)

osi

TCP/IP安全體系

tcp/ip1

tcp/ip2

Java安全組成

JCA(Java Cryptography Architecture)

提供基本的加密框架,比如訊息摘要、數字簽名等

JCE(Java Cryptography Extension)

JCA基礎上做了一些擴充套件,提供了很多加密的演算法、訊息摘要和金鑰管理等一些功能,比如DES、AES、RSA演算法通過JCE提供

JSSE(Java Secure Socket Extension)

提供基於SSL的加密功能,主要用於網路傳輸

JAAS(Java Authentication and Authentication Service)

提供Java平臺上進行使用者身份驗證功能

使用JDK以外的擴充套件包需要修改資原始檔並增加相關的內容,這是使用JDK以外的擴充套件包的方式之一。在\jdk1.8.0_191\jre\lib\security的java.security檔案中可檢視

例:security.provider.1=sun.security.provider.Sun

​ security.provider.2=com.sun.net.ssl.internal.ssl.Provider

相關Java包、類

java.security

​ —訊息摘要

javax.crypto

​ —安全訊息摘要,訊息認證(鑑別)碼

java.net.ssl

​ —安全套接字

第三方擴充套件

Bouncy Castle

​ —兩種支援方案:1)配置;2)呼叫

Commons Codec

​ —Apache

​ —Base64、二進位制、十六進位制、字符集編碼

​ —URL編碼/解碼

Base64演算法

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;

public class Base64 {

private static String str = "imooc security base64";

public static void main(String[] args){
    jdkBase64();
    commonsCodesBase64();
    bouncyCastleBase64();
}

public static void jdkBase64() {
    try {
        BASE64Encoder encoder = new BASE64Encoder();
        String encode = encoder.encode(str.getBytes());
        System.out.println("encode:"+encode);

        BASE64Decoder decoder = new BASE64Decoder();
        System.out.println("decode:"+new String(decoder.decodeBuffer(encode)));
    }catch (IOException e){
        e.printStackTrace();
    }
}

public static void commonsCodesBase64(){
    byte[] encodeBytes = org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes());
    System.out.println("encode:"+encodeBytes);

    byte[] decodeBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encodeBytes);
    System.out.println("decode:"+new String(decodeBytes));
}

public static void bouncyCastleBase64(){
    byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(str.getBytes());
    System.out.println("encode:"+new String(encodeBytes));

    byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
    System.out.println("decode:"+new String(decodeBytes));
}
}


執行結果:
encode:aW1vb2Mgc2VjdXJpdHkgYmFzZTY0
decode:imooc security base64
encode:[B@1d44bcfa	//很奇怪?為什麼不一樣呢
decode:imooc security base64
encode:aW1vb2Mgc2VjdXJpdHkgYmFzZTY0
decode:imooc security base64
複製程式碼

應用場景:e-mail、金鑰、證照檔案

產生:郵件是“歷史問題”

定義:基於64個字元的編碼演算法

關於RFC 2045

衍生:Base16、Base32、Url Base64

Base64演算法與加解密演算法

MD5

1

import org.apache.tomcat.util.security.MD5Encoder;

//將密碼加密
    public String EncodeByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        //確定計算方法
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        BASE64Encoder base64Encoder = new BASE64Encoder();
        //加密字串
        String newstr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));
        return newstr;
    }
複製程式碼

2

import org.springframework.util.DigestUtils;

//md5鹽值字串,用於混淆MD5
private final String slat = "sdcbbdguyg^&^$%^*GSQGSI!US*&wd?dwJHW@^^&g";

private String getMD5(long seckillId){
        String base = seckillId + "/" + slat;
        String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
        return md5;
    }
複製程式碼

相關文章