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
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 알고리즘의 원리는 주로 다음 단계로 나뉩니다.
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와 관련되어 있습니다. 설명은 다음과 같습니다.
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'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/
위 코드로 생성된 암호문을 입력하면 갑자기 해당 사이트가 뜹니다. 크랙이 있고 원리는 매우 간단합니다.
MD5에 대한 자세한 텍스트 정보는 Baidu Encyclopedia를 참조하세요.