중화사전망 - 서예자전 - MD5 는 어떻게 컴파일됩니까?

MD5 는 어떻게 컴파일됩니까?

MD5 소개

MD5 의 전체 이름은 Message-Digest Algorithm 5 로, MIT 컴퓨터 과학 연구소와 RSA 데이터 보안 회사가 90 년대 초에 발명하여 MD2, MD3, MD4 에서 개발되었습니다.

메시지 요약 (Message-Digest) 은 일반적으로 메시지의 해시 변환, 즉 모든 길이의 바이트 문자열을 특정 길이의 큰 정수로 변환하는 것을 의미합니다. "문자열" 대신 "바이트 문자열" 이라는 단어를 사용했습니다. 이 변환은 문자 세트나 인코딩 방법과는 무관하기 때문입니다.

MD5 는 임의의 길이의 "바이트 문자열" 을 128bit 의 큰 정수로 변환하는 돌이킬 수 없는 문자열 변환 알고리즘입니다. 즉, 소스 프로그램과 알고리즘에 대한 설명을 보더라도 MD5 값을 원래 문자열로 다시 변환할 수 없습니다. 수학적으로 볼 때, 무한한 원시 문자열이 있기 때문에, 반함수가 없는 수학 함수와 비슷하다.

MD5 의 일반적인 응용 프로그램은 메시지 (바이트 문자열) 에 대한 지문을 생성하여 변조를 방지하는 것입니다. 예를 들어, readme.txt 라는 파일에 단락을 쓰고 이 readme.txt 에 대한 MD5 값을 생성하여 기록하는 경우 이 파일을 다른 사람에게 전파할 수 있습니다. 다른 사용자가 파일의 내용을 수정한 경우 해당 파일의 MD5 를 다시 계산하면 해당 파일을 찾을 수 있습니다. 제 3 자 인증 기관이 있는 경우 MD5 는 문서 작성자의 "거부", 즉 디지털 서명 애플리케이션도 방지합니다.

MD5 는 암호화 및 암호 해독 기술에도 널리 사용됩니다. 많은 운영 체제에서 사용자의 암호는 MD5 값 (또는 이와 유사한 다른 알고리즘) 으로 저장됩니다. 사용자가 로그인하면 사용자가 입력한 비밀번호가 MD5 값으로 계산된 다음 시스템에 저장된 MD5 값과 비교되지만 사용자의 비밀번호가 무엇인지 "알" 수 없습니다.

일부 해커들이 이 비밀번호를 해독하는 방식은' 사전 실행' 이라는 방법이다. 사전을 가져오는 방법에는 두 가지가 있습니다. 하나는 매일 수집한 암호로 사용되는 문자열 테이블이고, 다른 하나는 조합을 정렬하여 생성하는 것입니다. 먼저 MD5 프로그램을 사용하여 이러한 사전 항목의 MD5 값을 계산한 다음 이 사전에서 대상의 MD5 값을 찾습니다.

최대 암호 길이가 8 이고 암호는 문자와 숫자일 수 있지만, ***26+26+ 10=62 자, 사전의 항목 수는 p (62,1)+p 입니다

사용자 계정 관리는 많은 전자 상거래 및 커뮤니티 응용 프로그램에서 가장 일반적으로 사용되는 기본 기능 중 하나입니다. 많은 응용 프로그램 서버가 이러한 기본 구성 요소를 제공하지만 많은 응용 프로그램 개발자는 관리 유연성을 높이기 위해 관계형 데이터베이스를 사용하여 사용자를 관리하는 것을 선호합니다. 게으른 방법은 사용자의 비밀번호가 일반적으로 일반 텍스트 또는 단순 변환 후 데이터베이스에 직접 저장되는 것입니다. 따라서 이러한 사용자의 암호는 소프트웨어 개발자나 시스템 관리자에게 더 이상 비밀이 아니라고 할 수 있습니다. 이 문서의 목적은 Java Bean 의 MD5 구현을 소개하고 MD5 를 사용하여 사용자 계정 비밀번호를 처리하는 예를 제공하는 것입니다. 이 방법을 사용하면 관리자와 프로그래머가 비밀번호를 초기화할 수 있지만 사용자의 비밀번호를 볼 수 없습니다. 그러나 사용자의 암호 설정 습관을 보호하는 것이 중요합니다.

관심 있는 독자는 MD5 의 텍스트, 즉 RFC 132 1 을 받을 수 있습니다. . ibm.com/developerworks/Java/jw-tips/tip106/index.shtml

이 문서에서는 테스트 및 예제 코드를 내부 정적 클래스에 배치할 때의 이점에 대해 설명합니다. 이는 좋은 엔지니어링 기술 및 방법입니다.

JSP 에 Java Bean 을 넣습니다

이 문서의 시작 부분에서 언급했듯이 MD5 Bean 애플리케이션은 사용자 관리를 기반으로 합니다. 여기서는 사용자 정보가 데이터베이스의 users 라는 테이블에 저장되는 가상 커뮤니티의 사용자 로그인 프로세스를 가정합니다. 이 테이블에는 userid :char(20) 와 pwdmd5 :char(32) 의 예와 관련된 두 개의 필드가 있습니다. Userid 는 테이블의 기본 키이고 pwdmd5 는 암호의 MD5 문자열을 저장합니다. MD5 값은 128bit 의 큰 정수이며 ASCII 코드로 16 을 나타내는 데 32 자가 필요합니다.

여기에는 두 개의 파일이 있습니다. login.html 은 사용자 입력 양식을 수락하는 데 사용되고 login 은 MD5 Bean 을 사용하는 로그인 프로세스를 시뮬레이션하는 데 사용됩니다.

테스트 환경을 단순화하기 위해 JSP 에 JDK 에 내장된 JDBC-ODBC 브리지 드라이버를 사용했습니다. community 는 ODBC DSN 의 이름입니다. 다른 login.jsp JDBC 드라이버를 사용하는 경우 교체하십시오.

Connectioncon = drivermanager.getconnection ("JDBC: odbc: community", "","","");

해봐.

Login.jsp 의 작동 원리는 간단합니다. Post 를 통해 사용자가 입력한 UserID 와 비밀번호를 받고 비밀번호를 MD5 문자열로 변환한 다음 users 테이블에서 UserID 와 pwdmd5 를 찾습니다. UserID 는 users 테이블의 기본 키이기 때문입니다. 변환된 pwdmd5 가 테이블의 레코드와 일치하지 않으면 SQL 조회에서 빈 결과 세트가 생성됩니다.

이 Bean 을 사용하려면 JSP 어플리케이션의 WEB-INF/classes 아래에 beartool 디렉토리를 만든 다음 MD5.class 를 그 디렉토리로 복사하기만 하면 됩니다. 일부 통합 개발 환경을 사용하는 경우 배포 도구 설명을 참조하십시오. JSP 에서 Java Bean 을 사용하는 주요 문은 프로그램의 두 번째 행입니다.

& ltjsp: usebeanid =' omd5' scope =' request' class =' beartool. MD5 '/& gt;;

모든 JSP 사양에 JSP 컨테이너 개발자가 제공해야 하는 표준 태그입니다.

Id= 실제로 JSP 컨테이너에 Bean 인스턴스를 만들도록 지시하는 인스턴스 변수 이름입니다. 뒤에

Java 응용 프로그램 서버가 수행하는 프로세스입니다. JSP 는 그것을 미리 컴파일하는 것이다. Java (사전 컴파일 시 해당 태그는 Java 문이 됨) 로 컴파일됩니다. 반. 이것들은 시스템에 의해 자동으로 완료되고 유지 관리됩니다. 클래스를 서브렛이라고도 합니다. 물론, 원한다면 Java Application servlet 가 해야 할 일을 하도록 도울 수 있고, 서블릿을 직접 쓸 수 있지만, 서블릿으로 HTML 을 출력하는 것은 C 로 CGI 프로그램을 쓰는 악몽 시대다.

출력이 복잡한 양식인 경우 익숙한 HTML 편집기를 사용하여 "템플릿" 을 작성한 다음 JSP 코드를 "포함" 하는 것이 더 편리합니다. 이 JSP 코드는 일부 전문가들에 의해' 공분' 이라고 비난받지만, 코드를 관리하고 재사용하기 어렵다는 단점이 있다. 하지만 이는 프로그래밍에 항상 필요한 트레이드오프다. (알버트 아인슈타인, Northern Exposure (미국 TV 드라마), 프로그램명언) 개인적으로 중소형 프로젝트에 이상적인 구조는 데이터 표현의 일부 (또는 느슨하게 웹 인터페이스 관련) 를 JSP 에 쓰고 인터페이스와 무관한 부분을 Bean 에 두는 것이라고 생각합니다. 일반적으로 서블릿을 직접 쓸 필요는 없습니다.

이 방법이 객체 지향적이지 않다고 생각되면 이를 확장하고 bean 을 작성하여 사용자 관리 기능을 캡슐화할 수 있습니다.

호환성이 호환되지 않습니까?

Resin 1.2.3, Sun J2EE 1.2, IBM WebSphere 3.5 등 세 가지 Java 응용 프로그램 서버 환경을 테스트했습니다. 다행스럽게도 이 Java Bean 은 운영 체제 및 I/O 장치를 포함하지 않는 컴퓨팅 프로그램이기 때문에 아무런 문제가 없습니다. 실제로 다른 언어는 호환성을 쉽게 구현할 수 있습니다. Java 의 유일한 장점은 실행 코드의 한 형태만 제공하면 된다는 것입니다. "형태학" 이라는 단어를 주목하세요. 오늘날 많은 컴퓨팅 구조 및 운영 체제는 언어 자체 외에도 많은 코드 형태를 정의합니다. 매우 간단한 C 언어 핵심 코드를 다른 형태로 변환하려면 많은 문제를 고려하고, 많은 도구를 사용하며, 동시에 많은 제한을 가해야 한다. 때로는 새로운' 형태학' 을 배우는 것이 문제 자체를 해결하는 것보다 더 많은 정력이 필요할 수 있다. 예를 들어 Windows 에만 EXE, Service, common DLL, COM DLL, OCX 등이 있습니다. Unix 에서는 간단하지만 많은 매크로를 정의하기 위해. H 를 제공해야 하며, 플랫폼마다 컴파일러 버전의 비트 길이도 고려해야 합니다. 나는 이것이 Java 가 나에게 매우 중요한 매력이라고 생각한다.

MD5 알고리즘 설명

첫째, 공석을 채우십시오.

둘째, 보충 데이터의 길이

셋째, MD5 매개변수를 초기화합니다

넷째, 가공 비트 작동 기능

다섯째, 주요 전환 과정

여섯째, 출력 결과

보충 자료:

MD5 알고리즘은 먼저 입력 데이터를 보완하여 데이터 비트 길이 LEN 을 5 12 로 보충하면 448 이 됩니다. 데이터가 K*5 12+448 비트로 확장됩니다. 즉 K*64+56 바이트이고 k 는 정수입니다.

구체적인 채우기 작업: 1 을 먼저 채운 다음 위 요구 사항이 충족될 때까지 0 을 채웁니다.

보충 데이터 길이:

데이터의 원래 길이 b 는 64 비트 숫자로, b 는 2 개의 32 비트 숫자로 표시됩니다

데이터는 길이가 5 12 비트의 배수로 채워집니다.

MD5 매개변수를 초기화하려면 다음과 같이 하십시오.

4 개의 32 비트 정수 (A, B, C, D) 는 정보 요약을 계산하는 데 사용되고 16 진수 테이블은 초기화에 사용됩니다.

표시된 숫자

A=0X0 1234567

B=0X89abcdef

C=0Xfedcba98

D=0X765432 10

처리 비트 작업 기능:

X, y, z 는 32 비트 정수입니다.

F(X, y, z) = x & Y | not (x) amp; Z

G(X, y, z) = x & Z|Y? (z)

H(X, y, Z) = X xor Y xor Z

I(X, y, Z) = Y xor (X|not(Z))

주요 변환 프로세스:

상수 배열 T[ 1...64] 를 사용합니다. 여기서 T[i] 는 16 진수 16 으로 표시되는 32 비트 정수이고 데이터는 16 32 비트입니다.

정수 배열 M[].

구체적인 프로세스는 다음과 같습니다.

/* 원시 데이터 처리 */

I = 0 부터 N/ 16- 1 do 까지의 경우

/* 매번 원시 데이터를 16 요소의 배열 x 에 저장합니다. */

J = 0 부터 15 까지의 경우

X[j] 를 M[i* 16+j] 로 설정합니다.

J 의 순환을 끝내다.

/* a 를 AA 로, b 를 BB 로, c 를 CC 로, d 를 d D d 로 저장합니다.

*/

AA = A

BB = B

CC = C

DD = D

/* 라운드1*/

/* 다음 작업은 [abcd k s i] 로 표시됩니다

A = b+((a+F(b, c, d)+x [k]+t [I]) < & lt& lts). */

/* 다음 16 작업을 수행합니다. */

[abcd071] [dabc1122] [cdab2173] [bcda

22 4]

[abcd475] [dabc5126] [cdab6177] [bcda7

22 8]

[abcd879] [dabc 91210] [cdab1017/kloc

1 1 22 12]

[ABCD12 713] [dabc131214/

[BCDA 15 22 16]

/* 2 라운드 * */

/* 다음 작업은 [abcd k s i] 로 표시됩니다

A = b+((a+G(b, c, d)+x [k]+t [I]) < & lt& lts). */

/* 다음 16 작업을 수행합니다. */

[ABCD1517] [dabc6 918] [cdab1/kloc-

0 20 20]

[ABCD 5 5 21] [dabc10 9 22] [cdab1514 23]

[BCDA 4 20 24]

[dabc14926] [cdab31427] [bcda

8 20 28]

[ABCD13 5 29] [dabc 2 930] [cdab714 31] [bcda

12 20 32]

/* 3 라운드 */

/* 다음 작업은 [abcd k s i] 로 표시됩니다

A = b+((a+H(b, c, d)+x [k]+t [I]) < & lt& lts). */

/* 다음 16 작업을 수행합니다. */

[abcd5433] [dabc 81134] [cdab11/kloc-;

[BCDA 14 23 36]

[ABCD14 37] [dabc41138] [cdab716 39] [

10 23 40]

[ABCD13 4 41] [dabc 01142] [cdab3/kloc-

[BCDA 6 23 44]

[abcd9445] [dabc121146] [cdab15/kloc

[BCDA 2 23 48]

/* 4 라운드 */

/* 다음 작업은 [abcd k s i] 로 표시됩니다

A = b+((a+I(b, c, d)+x [k]+t [I]) < & lt& lts). */

/* 다음 16 작업을 수행합니다. */

[ABCD 0 6 49] [dabc 710 50] [cdab1415 51]

[BCDA 5 2 1 52]

[ABCD12653] [dabc 31054] [cdab101555]

[BCDA 65438+2 1 56]

[ABCD 8 6 57] [dabc1510 58] [cdab615 59]

[BCDA 13 2 1 60]

[abcd46 61] [dabc1110 62] [cdab2/kloc-;

[BCDA 9 2 1 64]

/* 그런 다음 다음을 수행합니다 */

A = A+AA

B = B+BB

C = C+CC

D = D+DD

End /* 종료 I */ 루프

결과를 출력하다.