Java實現Base64加密


Java實現Base64加密

學習來源:
慕課網:https://www.imooc.com/learn/285


第1章 概述


1-1 密碼的常用術語


  • 密碼常用術語(一)
    明文:待加密信息。
    密文:經過加密后的明文。
    加密:明文轉為密文的過程。
    加密算法:明文轉為密文的轉換算法。
    加密密鑰:通過加密算法進行加密操作用的密鑰。
    解密:將密文轉為明文的過程。
    解密算法:密文轉為明文的算法。
    解密密鑰:通過解密算法進行解密操作用的密鑰。
    密碼分析:截獲密文者試圖通過分析截獲的密文從而推斷出原來的明文或密鑰的過程。
    主動攻擊:攻擊者非法入侵密碼系統,采用偽造、修改、刪除等手段向系統注入假消息進行欺騙。(對密文具有破壞作用)
    被動攻擊:對一個保密系統采取截獲密文並對其進行分析和攻擊。(對密文沒有破壞作用)
    密碼體制:由明文空間、密文空間、密鑰空間、加密算法和解密算法五部分構成。
    密碼協議:也稱安全協議,指以密碼學為基礎的消息交換的通信協議,目的是在網絡環境中提供安全的服務。
    密碼系統:指用於加密、解密的系統。
    柯克霍夫原則:數據的安全基於密鑰而不是算法的保密。即系統的安全取決於密鑰,對密鑰保密,對算法公開。——現代密碼學設計的基本原則

1-3 密碼分類


  • 時間
    古典密碼:以字符為基本加密單元。
    現代密碼:以信息塊為基本加密單元。(多個字符)

  • 保密內容

名稱 詳細說明 應用領域 類別
受限制算法 算法的保密性基於保持算法的秘密(算法保密) 軍事領域 古典密碼
基於密鑰算法 算法的保密性基於對密鑰的保密(密鑰保密) 現代密碼
  • 密碼體制
名稱 別名 詳細說明
對稱密碼 單鑰密碼或私鑰密碼 指加密密鑰與解密密鑰相同
非對稱密碼 雙鑰密碼或公鑰密碼 指加密密鑰與解密密鑰不同,密鑰分公鑰、私鑰
對稱密碼算法 單鑰密碼算法或私鑰密碼算法 指應用於對稱密碼的加密、解密算法
非對稱密碼算法 雙鑰密碼算法或公鑰密碼算法 指對應於非對稱密碼的加密、解密算法
  • 明文處理方法

    分組密碼:指加密時將名為分成固定長度的組,用同一密鑰和算法對每一塊加密,輸出也是固定長度的密文。多用於網絡加密。(一次加密一組明文)

    流密碼:也稱序列密碼。指加密時每次加密一位或者一個字節明文。(一次加密一個明文)

1-3-1散列函數


作用:散列函數用來驗證數據的完整性

特性:

  • 長度不受限制
  • 哈希值容易計算
  • 散列運算過程不可逆

散列函數相關的算法:

  • 消息摘要算法MD5等
  • SHA—-安全散列算法
  • MAC——消息認證碼算法(MAC——蘋果操作系統--同名)

1-3-2數字簽名


作用:主要是針對以數字的形式存儲的消息進行的處理

1-4 OSI與TCP/IP安全體系


1-4-1OSI安全體系


OSI(Open SystemInterconnection)開放式通信系統

網絡通信:

  • 7.應用層
  • 6.表示層
  • 5.會話層
  • 4.傳輸層
  • 3.網絡層
  • 2.數據鏈路層
  • 1.物理層

網絡通信安全機制:

  • 加密機制
  • 數字簽名機制
  • 訪問控制機制
  • 數據完整性機制
  • 認證機制
  • 業務流填充機制
  • 路由控制機制
  • 公正機制

網絡通信安全服務:

  • 認證(鑒別):在交互時,對接收方和發送方的身份和數據的來源進行驗證;
  • 訪問控制服務:防止沒有授權的用戶非法訪問;
  • 數據保密性服務:防止數據傳輸時被泄露和篡改;
  • 數據完整性服務:保證傳輸時,沒有被改變原有內容;
  • 抗否認性服務:防止雙方否認自己的操作

1-4-2 TCP/IP安全體系


TCP/IP和OSI體系層級區別:

1544704043348

TCP/IP安全體系結構:每一層都有對應的安全處理方式

1544704107405

TCP/IP安全體系:

1544704424353

1-5 java安全組成、包及第三方擴展


Java安全組成

  • JCA(Java Cryptography Architecture):加密體系結構
    • 提供基本的加密框架,如:消息摘要,數字簽名等;
  • JCE(Java Cryptography Extension):加密擴展包
    • 擴展提供了 加密算法/消息摘要/密鑰管理功能
    • DES、AES、RSA算法通過JCE提供
  • JSSE(Java Secure Socket Extension):安全套接字擴展包
    • JSSE提供基於SSL的加密功能,主要用於網絡傳輸
  • JAAS(Java Authentication and Authentication Service):鑒別與安全服務
    • java平台的用戶身份驗證(權限等)
security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.net.ssl.internal.ssl.Provider
security.provider.3=com.sun.rsajca.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider

使用JDK以外的(第三方)擴展包需要修改資源文件並增加相關的內容,這是使用JDK以外的擴展包的方式之一。

jar包位置:

\jre\lib\security\java.security

1544705204043

添加第三方加密方法:

  1. 在下方從11開始添加;
  2. Note: Providers can be dynamically registered instead by calls to either the addProvider or insertProviderAt method in the Security class.(硬編碼方式)

相關java包、類

  • java.security(源碼可見)
    • 消息摘要
  • javax.crypto
    • 安全消息摘要,消息認證(鑒別)碼
  • java.net.sll
    • 安全套接字:網絡傳輸相關的加解密;HttpsURLConnection、SSLContext

第三方java擴展

  • Bouncy Castle(開源的)
    • 兩種支持方案(上方的兩種添加方式都可以使用):1)配置;2)調用
  • Commons Codec(開源的)
    • Apache提供
    • Base64、二進制、十六進制、字符集編碼
    • Url編碼/解碼

第2章 Base64算法實現


  • 算法實現方式:
    Jdk(無需jar包)
    Commons Codec(需要jar包,與jdk版本一致,案例包:bcprov-jdk15on-149.jar)
    Bouncy Castle(需要jar包,案例包:commons-codec-1.10.jar)

2-1 實現Base64算法


jdk的base64加密,解密


    /**
     * jdk的base64加密,解密
     * @throws IOException
     */
      public static void jdkbase64()  {
          BASE64Encoder encoder =new BASE64Encoder();
          String encode = encoder.encode(src.getBytes());//加密,為String
          System.out.println("encode = " + encode);
          BASE64Decoder decoder=new BASE64Decoder();
          try {
               System.out.println("decoder = "+new String(decoder.decodeBuffer(encode)));//解密.解密為數組
          } catch (IOException e) {
              e.printStackTrace();
          }
      }

運行結果:
encode = aGVsbG8gd29ybGQ=
decoder = hello world

commonsCodes的base64加密,解密


    /**
     * commonsCodes的base64加密,解密
     org.apache.commons.codec.binary.Base64
     */
      public static void commonsCodesBase64()  {

          byte[] encodeBases = Base64.encodeBase64(src.getBytes());
          System.out.println("encodeBases = " + new String(encodeBases));
          byte[] decodeBase64 = Base64.decodeBase64(encodeBases);
          System.out.println("decodeBase64= " + new String(decodeBase64));
      }
運行結果:
encodeBases = aGVsbG8gd29ybGQ=
decodeBase64= hello world

bouncyCastle的base64加密,解密


    /**
     * bouncyCastle的base64加密,解密
     org.bouncycastle.util.encoders.Base64
     */
      public static void bouncyCastleBase64()  {
          byte[] encode = Base64.encode(src.getBytes());
          System.out.println("new String(encode) = " + new String(encode));
          byte[] decode = Base64.decode(encode);
          System.out.println("decode = " + new String(decode));
      }
運行結果:
new String(encode) = aGVsbG8gd29ybGQ=
decode = hello world

2-2 Base64算法應用場景


  • 應用場景:e-mail、密鑰、證書文件
  • 定義:基於64個字符的編碼算法
  • 關於RFC 2045
  • 衍生:Base16、Base32、Url Base64





附件列表

     


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM