首頁 Java java教程 Java 四種基本加密演算法

Java 四種基本加密演算法

Feb 27, 2017 pm 03:27 PM

Java 四種基本加密演算法分析

簡單的java加密演算法有:

  1. BASE64 嚴格地說,屬於編碼格式,而非加密演算法

  2. MD5(Message Digest algorithm 5,訊息摘要演算法)

  3. ##SHA(Secure Hash Algorithm,安全散列演算法)

  4. HMAC(Hash Message Authentication Code,散列訊息鑑別碼)


1. BASE64

Base64是網路上最常見的傳送8Bit位元組程式碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規格。 Base64編碼可用於在HTTP環境下傳遞較長的識別資訊。例如,在Java Persistence系統hibernate中,就採用了Base64來將一個較長的唯一識別碼(一般為128-bit的UUID)編碼為一個字串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程式中,也常常需要把二進位資料編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具有不可讀性,即編碼的資料不會被人用肉眼所直接看到。 (來源百度百科)

java實作程式碼:

package com.cn.单向加密;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*
BASE64的加密解密是双向的,可以求反解.
BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,
一般来说是不推荐使用的。 
BASE64 严格地说,属于编码格式,而非加密算法 
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。 
BASE64 
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
*/

public class BASE64 {
  /** 
   * BASE64解密 
   *  
   * @param key 
   * @return 
   * @throws Exception 
   */ 
  public static byte[] decryptBASE64(String key) throws Exception {  
    return (new BASE64Decoder()).decodeBuffer(key);  
  }  

  /** 
   * BASE64加密 
   *  
   * @param key 
   * @return 
   * @throws Exception 
   */ 
  public static String encryptBASE64(byte[] key) throws Exception {  
    return (new BASE64Encoder()).encodeBuffer(key);  
  } 

  public static void main(String[] args) {

   String str="12345678";

    try {
    String result1= BASE64.encryptBASE64(str.getBytes());
     System.out.println("result1=====加密数据=========="+result1);

     byte result2[]= BASE64.decryptBASE64(result1);
     String str2=new String(result2);
     System.out.println("str2========解密数据========"+str2);
  } catch (Exception e) {
    e.printStackTrace();
  }

  }

}
登入後複製

2. MD5

MD5即Message-Digest Algorithm 5(訊息-摘要演算法5),用於確保訊息傳輸完整一致。是電腦廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有MD5實作。將資料(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD5的前身有MD2、MD3和MD4。廣泛用於加密解密技術,常用於文件校驗。校驗?不管文件多大,經過MD5後都能產生唯一的MD5值。好比現在的ISO校驗,都是MD5校驗。怎麼用?當然是把ISO經過MD5後產生MD5的數值。一般下載Linux-ISO的朋友都看過下載連結旁邊放著MD5的串。就是用來驗證文件是否一致的。

java實作:

package com.cn.单向加密;

import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法) 
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串
Digest:汇编
*/
public class MD5 {
  public static final String KEY_MD5 = "MD5";  

  public static String getResult(String inputStr)
  {
    System.out.println("=======加密前的数据:"+inputStr);
    BigInteger bigInteger=null;

    try {
     MessageDigest md = MessageDigest.getInstance(KEY_MD5);  
     byte[] inputData = inputStr.getBytes(); 
     md.update(inputData);  
     bigInteger = new BigInteger(md.digest());  
    } catch (Exception e) {e.printStackTrace();}
    System.out.println("MD5加密后:" + bigInteger.toString(16));  
    return bigInteger.toString(16);
  }

  public static void main(String args[])
  {
    try {
       String inputStr = "简单加密8888888888888888888";  
       getResult(inputStr);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}
登入後複製

MD5演算法有以下特點:

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。

2、容易計算:從原始資料計算MD5值很容易。
3、抗修改性:對原始資料進行任何改動,即使只修改1個位元組,所得到的MD5值都有很大差異。
4、弱抗碰撞:已知原始資料和其MD5值,想找出一個具有相同MD5值的資料(即偽造資料)是非常困難的。
5、強抗碰撞:想找出兩個不同的數據,使它們有相同的MD5值,是非常困難的。
MD5的作用是讓大容量資訊在用數位簽章軟體簽署私人金鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進位數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。

3.SHA

安全雜湊演算法(Secure Hash Algorithm)主要適用於數位簽章標準(Digital Signature Standard DSS)裡面定義的數位簽章演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位元的訊息,SHA1會產生一個160位元的訊息摘要。該演算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。這個演算法的想法是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或訊息),並把它們轉換為長度較短、位數固定的輸出序列即是散列值(也稱為資訊摘要或資訊認證代碼)的過程。雜湊函數值可以說是對明文的一種「指紋」或「摘要」所以對雜湊值的數位簽章就可以視為對此明文的數位簽章。

java實作:

package com.cn.单向加密;

import java.math.BigInteger;
import java.security.MessageDigest;

/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 
但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/
public class SHA {
   public static final String KEY_SHA = "SHA";  

  public static String getResult(String inputStr)
  {
    BigInteger sha =null;
    System.out.println("=======加密前的数据:"+inputStr);
    byte[] inputData = inputStr.getBytes();  
    try {
       MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); 
       messageDigest.update(inputData);
       sha = new BigInteger(messageDigest.digest());  
       System.out.println("SHA加密后:" + sha.toString(32));  
    } catch (Exception e) {e.printStackTrace();}
    return sha.toString(32);
  }

  public static void main(String args[])
  {
    try {
       String inputStr = "简单加密";  
       getResult(inputStr);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}
登入後複製

#SHA-1與MD5的比較

因為二者皆由MD4導出,SHA-1和MD5彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:

l 對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。

l 對密碼分析的安全性:由於MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。

l 速度:在相同的硬體上,SHA-1的運作速度比MD5慢。

4.HMAC

HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

java实现代码:

package com.cn.单向加密;
/*
HMAC 
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,
即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import com.cn.comm.Tools;

/** 
 * 基础加密组件 
 */ 
public abstract class HMAC {  
  public static final String KEY_MAC = "HmacMD5";  

  /** 
   * 初始化HMAC密钥 
   *  
   * @return 
   * @throws Exception 
   */ 
  public static String initMacKey() throws Exception {  
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
    SecretKey secretKey = keyGenerator.generateKey();  
    return BASE64.encryptBASE64(secretKey.getEncoded());  
  }  

  /** 
   * HMAC加密 :主要方法
   *  
   * @param data 
   * @param key 
   * @return 
   * @throws Exception 
   */ 
  public static String encryptHMAC(byte[] data, String key) throws Exception {  

    SecretKey secretKey = new SecretKeySpec(BASE64.decryptBASE64(key), KEY_MAC);  
    Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    mac.init(secretKey);  
    return new String(mac.doFinal(data));  

  }  

  public static String getResult1(String inputStr)
  {
    String path=Tools.getClassPath();
    String fileSource=path+"/file/HMAC_key.txt";
    System.out.println("=======加密前的数据:"+inputStr);
    String result=null;
    try {
      byte[] inputData = inputStr.getBytes(); 
      String key = HMAC.initMacKey(); /*产生密钥*/ 
      System.out.println("Mac密钥:===" + key); 
      /*将密钥写文件*/
      Tools.WriteMyFile(fileSource,key);
      result= HMAC.encryptHMAC(inputData, key);
      System.out.println("HMAC加密后:===" + result); 
    } catch (Exception e) {e.printStackTrace();} 
    return result.toString();
  }

  public static String getResult2(String inputStr)
  {
    System.out.println("=======加密前的数据:"+inputStr);
     String path=Tools.getClassPath();
     String fileSource=path+"/file/HMAC_key.txt";
     String key=null;;
    try {
       /*将密钥从文件中读取*/
       key=Tools.ReadMyFile(fileSource);
       System.out.println("getResult2密钥:===" + key); 
    } catch (Exception e1) {
      e1.printStackTrace();}
    String result=null;
    try {
      byte[] inputData = inputStr.getBytes(); 
      /*对数据进行加密*/
      result= HMAC.encryptHMAC(inputData, key);
      System.out.println("HMAC加密后:===" + result); 
    } catch (Exception e) {e.printStackTrace();} 
    return result.toString();
  }

  public static void main(String args[])
  {
    try {
       String inputStr = "简单加密"; 
       /*使用同一密钥:对数据进行加密:查看两次加密的结果是否一样*/
       getResult1(inputStr); 
       getResult2(inputStr);

    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}
登入後複製

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多Java 四种基本加密算法相关文章请关注PHP中文网!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

See all articles