>类库下载 >java类库 >Java MD5 암호화 알고리즘

Java MD5 암호화 알고리즘

高洛峰
高洛峰원래의
2016-11-05 10:18:211778검색

MD5(Message Digest Algorithm 5)는 메시지 다이제스트 알고리즘의 5번째 버전으로 번역됩니다. 규칙에 따르면 MD2 및 MD3과 같은 이름을 가진 이전 버전도 있을 수 있다고 추론합니다. 이 알고리즘을 전혀 이해하지 못하는군요. 소위 초록은 제가 쓴 졸업 논문처럼 첫 번째 부분이 짧고 강력한 요약입니다. 실제로 MD5의 기능을 요약하자면 다음과 같습니다. MD5 알고리즘의 기능을 설명하는 단락을 살펴보겠습니다.


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


A가 먼 곳에서 B에게 100만 단어의 텍스트 파일을 전송하려고 한다고 가정해 보겠습니다. 도중에 파일이 변조되었는지 여부를 알 수 있습니까? 누군가 파일을 중간에 자르고 변조하면 내용이 그다지 좋지 않으며 파일이 아무리 크더라도 MD5가 유용합니다. MD5 암호화 후 고정 길이 문자열(보통 32비트) 이때 A는 먼저 파일을 MD5로 암호화하고, 획득한 암호문 문자열도 B로 전달됩니다. B는 파일을 수신하면 MD5로 파일도 암호화하여 다음으로 전달합니다. 획득한 암호문이 A가 보낸 암호문과 일치하는지 확인하세요. 일치하면 파일이 안전하다는 뜻입니다.

실제로 파일을 다운로드할 때 인터넷에서는 다운로드한 파일 뒤에 MD5(e8027a87676ea48b3a3c9b0a4d8d87a0)와 같은 MD5 암호문이 있는 경우도 있습니다. 이 기능은 위에 제시한 예와 유사합니다(그렇다고 생각합니다...). 공개적이고 되돌릴 수 없는 알고리즘입니다. 즉, 소스 데이터를 얻기 위해 암호문을 직접 해독할 수 있는 방법이 없습니다. 참고로, md5는 모든 크기의 파일에 대해 암호화 작업을 수행하여 고유한 32비트 문자열을 얻을 수 있습니다.


MD5의 기능을 간략히 이해한 후, 직접 코드를 살펴보시면 됩니다.


Java 코드로 MD5 암호화 구현


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


fc5e038d38a57032085441e7fe7010b0

fc5e038d38a57032 085441e7fe7010b0
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.
 */
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);
    }

}

동일한 필드가 암호화되면 얻은 암호문은 항상 동일함을 알 수 있습니다. 다음으로, 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 클래스는 애플리케이션에 MD5 또는 SHA 알고리즘과 같은 메시지 다이제스트 알고리즘의 기능을 제공합니다. 메시지 다이제스트는 모든 크기의 데이터를 허용하고 고정 길이 해시 값을 출력하는 안전한 단방향 해시 함수입니다.
public abstract class MessageDigest
    extends MessageDigestSpi


MessageDigest 개체가 초기화되기 시작합니다. 이 개체는 업데이트 메서드를 사용하여 데이터를 처리합니다. 다이제스트는 재설정 메소드를 호출하여 언제든지 재설정할 수 있습니다. 업데이트해야 하는 모든 데이터가 업데이트되면 다이제스트 메서드 중 하나를 호출하여 해시 계산을 완료해야 합니다.

다이제스트 메서드는 업데이트된 데이터의 특정 양에 대해 한 번만 호출할 수 있습니다. 다이제스트가 호출된 후 MessageDigest 객체는 초기 상태로 재설정됩니다.

구현 시 Cloneable 인터페이스 구현 여부를 임의로 선택할 수 있습니다. 클라이언트 애플리케이션은 복제를 시도하고 CloneNotSupportedException을 포착하여 복제 가능성을 테스트할 수 있습니다.


다이제스트 수를 미리 알고 있는 동안 특정 구현을 복제할 수 없는 경우에도 여전히 중간 계산 능력 여러 인스턴스를 인스턴스화하여 요약합니다.


위 코드의 주석에 주요 메소드의 기능을 기재하였으므로 여기서는 소개하지 않겠습니다.

 MessageDigest md = MessageDigest.getInstance("SHA");
 try {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest();
     md.update(toChapter2);
     ...etc.
 } catch (CloneNotSupportedException cnse) {
     throw new DigestException("couldn&#39;t make digest of partial content");
 }

MD5의 적용 분야는 크게 다음과 같이 나눌 수 있습니다. 카테고리:



1. 변조 방지(파일 무결성 확인) 예를 들어 범죄자가 설치에 트로이 목마를 추가하는 것을 방지하기 위해 파일 다운로드를 제공합니다. 프로그램을 웹사이트에 추가할 수 있습니다. 설치 파일에서 얻은 MD5 출력을 게시합니다.

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

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

MD5는 되돌릴 수 없는 알고리즘이지만 크랙이 불가능한 것은 아닙니다. 대부분의 사용자는 비밀번호를 설정할 때 생일, 약칭 등 특별한 의미가 있는 필드를 사용합니다. 귀하의 관련 정보를 파악하고 귀하가 사용할 수 있는 비밀번호를 추측한 다음 MD5로 모두 암호화하면 많은 암호문을 얻은 다음 귀하의 비밀번호와 내 암호문 라이브러리에 있는 암호문을 얻을 수 있습니다. 동일한 방식으로 현재 많은 웹사이트에서는 MD5 값 쿼리 기능을 제공하고 있습니다. MD5 비밀번호 값이 데이터베이스에 있으면 해당 값이 문자열에 존재합니다. 예를 들어 위의 코드에서는 "helloworld"라는 문자열을 MD5로 암호화했습니다. 이론적으로 암호문만 알면 원본 데이터를 해독할 수 없습니다. 그런데 정말 그런가요? http://pmd5.com/

Java MD5 암호화 알고리즘

위 코드로 생성된 암호문을 입력하면 갑자기 해당 사이트가 뜹니다. 크랙이 있고 원리는 매우 간단합니다.

MD5에 대한 자세한 텍스트 정보는 Baidu Encyclopedia를 참조하세요.


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