>Java >java지도 시간 >Java의 네 가지 기본 암호화 알고리즘

Java의 네 가지 기본 암호화 알고리즘

高洛峰
高洛峰원래의
2017-02-27 15:27:141375검색

Java의 4가지 기본 암호화 알고리즘 분석

간단한 Java 암호화 알고리즘은 다음과 같습니다.

  1. BASE64 엄밀히 말하면, 암호화 알고리즘이 아닌 인코딩 형식

  2. MD5(Message Digest 알고리즘 5, 메시지 다이제스트 알고리즘)

  3. SHA(Secure Hash Algorithm, secure hash) 알고리즘) 컬럼 알고리즘)

  4. HMAC(해시 메시지 인증 코드, 해시 메시지 인증 코드)

1.

Base64는 인터넷에서 8비트 바이트 코드를 전송하는 가장 일반적인 인코딩 방법 중 하나입니다. MIME에 대한 자세한 사양이 나와 있는 RFC2045~RFC2049를 확인할 수 있습니다. Base64 인코딩은 HTTP 환경에서 더 긴 식별 정보를 전달하는 데 사용될 수 있습니다. 예를 들어, Java Persistence 시스템 최대 절전 모드에서 Base64는 긴 고유 식별자(일반적으로 128비트 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();
  }

  }

}

MD5

MD5 즉, 완전하고 일관된 정보 전송을 보장하기 위해 사용되는 메시지-다이제스트 알고리즘 5(Message-Digest Algorithm 5)이다. MD5는 컴퓨터에서 널리 사용되는 해시 알고리즘 중 하나입니다(다이제스트 알고리즘 및 해시 알고리즘으로도 번역됨). 일반적으로 주류 프로그래밍 언어로 구현됩니다. 데이터(예: 한자)를 다른 고정 길이 값으로 계산하는 것이 해시 알고리즘의 기본 원리입니다. MD5의 전신에는 MD2, MD3 및 MD4가 있습니다. 암호화 및 암호 해독 기술에 널리 사용되며 파일 확인에 자주 사용됩니다. 확인하다? 파일 크기에 관계없이 MD5 이후에는 고유한 MD5 값이 생성될 수 있습니다. 예를 들어 현재 ISO 검증은 MD5 검증입니다. 그것을 사용하는 방법? 물론 MD5 값은 ISO를 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의 기능은 디지털 서명 소프트웨어로 개인 키에 서명하기 전에 대용량 정보를 기밀 형식으로 "압축"할 수 있도록 하는 것입니다(즉, 임의 길이의 바이트 문자열을 특정 길이의 16진수로 변환). 길이 문자열). MD5 외에도 sha-1, RIPEMD 및 Haval이 더 유명합니다.

3.SHA

Secure Hash Algorithm은 주로 DSS(Digital Signature Standard)에서 정의하는 디지털 서명 알고리즘(Digital Signature Standard DSS)에 적용됩니다. 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으로 문의하세요.