>  기사  >  Java  >  Java MD5 암호화 알고리즘

Java MD5 암호화 알고리즘

伊谢尔伦
伊谢尔伦원래의
2016-12-10 09:19:171405검색

Message Digest Algorithm의 5번째 버전으로 번역된 MD5(Message Digest Algorithm 5)는 규칙에 따라 MD2 및 MD3과 같은 이름을 가진 이전 버전도 있을 수 있다고 추론합니다.

심지어 이 알고리즘을 전혀 이해하지 못한다면 이름에서 몇 가지 단서를 찾을 수도 있습니다. 소위 초록은 제가 쓴 졸업 논문처럼 짧은 요약입니다. 이어지는 긴 글을 요약하자면 사실 MD5의 기능은 대략 이렇습니다. MD5 알고리즘의 기능을 설명하는 단락을 살펴보겠습니다.

MD5의 기능은 다음과 같습니다. 개인 키에 서명하기 위해 디지털 서명 소프트웨어를 사용하기 전에 대용량 정보를 "서명"할 수 있도록 합니다. 기밀 형식으로 "압축"합니다(즉, 임의 길이의 바이트 문자열을 특정 길이의 큰 정수로 변환). 이는 주로 데이터 전송의 무결성과 일관성을 보장하는 데 사용됩니다.

A가 B에게 멀리서 전달하려고 100만 단어의 텍스트 파일을 보냈다고 가정해 보겠습니다. B는 파일을 받았는지 어떻게 알 수 있습니까? 전송 중에 누군가가 파일 내용을 자르고 변조하면 좋지 않습니다. 이제 MD5는 파일 크기에 관계없이 MD5로 암호화한 후에는 유용합니다. 보통 32비트의 고정 길이 문자열을 얻습니다. 이때 A는 먼저 파일을 MD5로 암호화하고 비밀번호 문자열을 얻습니다. 그런데 파일도 B에게 전달됩니다. B도 파일을 받으면 암호화합니다. 획득한 암호문이 A가 보낸 암호문과 일치하는지 확인하기 위해 MD5가 포함된 파일을 확인합니다. 일치하면 파일이 안전하다는 의미입니다.

실제로, 인터넷에서 파일을 다운로드하는 경우 때로는 다운로드한 파일 뒤에 MD5(e8027a87676ea48b3a3c9b0a4d8d87a0)와 같은 MD5 암호 텍스트가 있는데, 이는 위와 동일한 효과를 갖습니다(그렇다고 생각합니다...).

MD5는 되돌릴 수 없는 공용 알고리즘입니다. 즉, 소스 데이터 정보를 얻기 위해 암호문을 직접 해독할 수 있는 방법이 없습니다. MD5는 어떤 크기든 하나씩 쌍으로 파일을 암호화하고 고유한 32비트 문자열을 얻을 수 있습니다.

MD5의 기능을 간략하게 이해한 후,

Java 코드로 MD5 암호화를 구현합니다.

코드 복사
package com.wang.encryption
import; com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.MessageDigest
/* *
* @author yogo.wang
* @date 2016/11/04-1:02 pm
*/
public class MD5Test {
public static String md5Encode(String msg) throws Exception{

byte[] msgBytes = msg.getBytes("utf-8");
    /**
     * 声明使用Md5算法,获得MessaDigest对象
     */
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    /**
     * 使用指定的字节更新摘要
     */
    md5.update(msgBytes);
    /**
     * 完成哈希计算,获得密文
     */
    byte[] digest = md5.digest();
    /**
     * 以上两行代码等同于 byte[] digest = md5.digest(msgBytes);
     */
    return bytesToHexString(digest);
}
/**
 * 将byte数组转化为16进制字符串形式
 * @param bys
 * @return
 */
public static String byteArr2hexString(byte[] bys){
    StringBuffer hexVal=new StringBuffer();
    int val=0;
    for (int i = 0; i < bys.length; i++) {
        //将byte转化为int  如果byte是一个负数就必须要和16进制的0xff做一次与运算
        val=((int)bys[i]) & 0xff;
        if(val<16){
            hexVal.append("0");
        }
        hexVal.append(Integer.toHexString(val));
    }
    return hexVal.toString();
}
public static void main(String[] args) throws Exception {
    String msg="helloworld";
    String result=md5Encode(msg);
    String result1=md5Encode(msg);
    System.out.println(result);
    System.out.println(result1);
}
}

코드 복사
코드 실행 및 get 출력 결과는 다음과 같습니다.

fc5e038d38a57032085441e7fe7010b0

fc5e038d38a57032085441e7fe7010b0

동일한 필드가 암호화되면 얻어지는 암호문이 항상 동일함을 알 수 있습니다. 다음으로 MD5 원칙과 구현 적용을 살펴보겠습니다. MD5 구현 원리 및 응용

인터넷에서 일부 친구가 구현한 일부 md5 암호화 코드를 읽었지만 여기에 게시하고 인터넷에 몇 가지 구현 단계를 소개하겠습니다. 살펴보세요)

MD5 알고리즘의 원리는 크게 다음과 같은 단계로 나누어집니다.

 1) 채우기: 먼저 입력 정보의 길이(비트)를 512가 되도록 채웁니다. 나머지는 448과 같습니다. 채우는 방법은 1과 n개의 0을 채우는 것입니다.

2) 레코드 정보 길이 : 채우기 전 정보 길이를 저장하기 위해 64비트를 사용합니다. 이 64비트는 첫 번째 단계의 결과 뒤에 추가되므로 정보 길이는 N*512+448+64=(N+1)*512비트가 됩니다.

3) 표준 매직넘버 로드: 표준 매직넘버는 (A=(01234567)16, B=(89ABCDEF)16, C=(FEDCBA98)16, D=(76543210)16)입니다. 프로그램에 정의되어 있다면 (A=0X67452301L, B=0XEFCDAB89L, C=0X98BADCFEL, D=0X10325476L)이어야 합니다.

4) 4회 루프 작동: 루프 수는 그룹 수(N+1)입니다.

여기서는 주로 Java의 MessageDigest 클래스를 소개합니다. jdk 개발 문서를 확인하면 이 클래스가 java.security 패키지 하위에 있음을 알 수 있습니다. 문서에서는 다음과 같이 MessageDigest를 설명합니다. 공용 추상 클래스 MessageDigest

MessageDigest md = MessageDigest.getInstance("SHA");

시도 {

extends MessageDigestSpi
  此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
  MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。
  对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。
  实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:

} catch(CloneNotSupportedException cnse) {

}
md.update(toChapter1);
 MessageDigest tc1 = md.clone();
 byte[] toChapter1Digest = tc1.digest();
 md.update(toChapter2);
 ...etc.

주어진 구현이 복제 가능하지 않고 다이제스트 수가 미리 알려진 경우에도 여러 인스턴스를 인스턴스화하여 중간 다이제스트를 계산할 수 있습니다.

1. 변조 방지(파일 무결성 검증) 예를 들어, 범죄자가 설치 프로그램에 트로이 목마를 추가하는 것을 방지하기 위해 파일 다운로드를 제공하면 설치 파일에서 얻은 MD5 출력 결과를 다음 위치에 게시할 수 있습니다. 웹사이트.
throw new DigestException("couldn&#39;t make digest of partial content");

2. 일반 텍스트 직접 열람 방지(비밀번호 암호화) 요즘 많은 웹사이트에서는 사용자 비밀번호를 데이터베이스에 저장할 때 사용자 비밀번호의 MD5 값을 저장합니다. 이런 방식으로 범죄자가 데이터베이스에서 사용자 비밀번호의 MD5 값을 획득하더라도 사용자의 비밀번호를 알 수 없습니다.

3. 부인 방지(디지털 서명) 예를 들어 A가 파일을 작성하면 인증기관은 MD5 알고리즘을 사용하여 파일에 대한 요약 정보를 생성하고 기록합니다. 이를 통해 향후 A씨가 해당 사실을 인정하지 않아 발생하는 문제를 예방할 수 있다.

MD5는 되돌릴 수 없는 알고리즘이지만 크랙이 불가능한 것은 아닙니다. 대부분의 사용자는 비밀번호를 설정할 때 생일, 약칭 등 특별한 의미가 있는 필드를 사용합니다. 사용할 수 있는 비밀번호를 모두 MD5로 암호화하여 많은 암호문을 얻은 다음, 비밀번호의 암호문을 가져와 내 암호문 라이브러리와 하나씩 비교합니다. 암호문이 일치하면 비밀번호 자체는 다음과 같습니다. 자멸적이다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.