이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 15992|회답: 1

[안전 튜토리얼] 텐센트도 사용 중입니다! 웹 파일 변조 방지 시스템(MD5 암호화 구현) 해킹 방지 튜토리얼

[링크 복사]
게시됨 2014. 11. 20. 오후 2:04:34 | | | |
MD5알고리즘 개요
MD5이 기능은 정보 조각에 관한 것입니다(메시지)정보 요약 생성(메시지 요약)요약은 정보에 고유합니다,디지털 서명으로도 사용할 수 있습니다. 문서의 유효성을 검증하는 데 사용됩니다(데이터가 손실되거나 손상되었는지 여부),사용자의 비밀번호 암호화 시 해시 값이 해시 함수에서 계산됩니다. 임의의 길이의 바이트트링을 입력하여 생성합니다128비트의 정수입니다. 알고리즘의 일부 되돌릴 수 없는 특성 덕분에 암호화 응용 분야에서 우수한 보안을 제공합니다. 그리고MD5알고리즘 사용에는 저작권 수수료 납부가 필요하지 않습니다. 고유성이나 비가역성은 절대적이지 않으며, 이론적으로는 다대일 관계로 분석할 수 있지만, 서로 다른 두 정보가 동일한 요약을 내놓을 확률은 작다. 비가역적이라는 것은 입력과 출력을 추론하는 데 필요한 계산 시간과 시간이 너무 많고, 사전 검색 방식이 너무 많은 저장 공간을 요구한다는 뜻입니다.
시스템디자인 아이디어
이 시스템은 자바 웹을 기반으로 합니다, 그리고 다음스트럿2이를 이루기 위해서입니다. 기본 설계 아이디어는 통과하는 것입니다시스템 외부 메모리에서 파일을 두 번 계산하기 위해MD5값과 비교, 동일하면 파일이 조작되지 않았고, 다르면 파일이 조작되었다는 뜻입니다.
버전 파일 변조 방지 시스템 상세 설계 아이디어: 통과JSP시스템의 외부 메모리에서 계산해야 할 파일을 불러옵니다.JSP제출 후 합격하세요스트럿2작전값과 함께 있는 것으로 건너뛰기자바논리 계층. 논리 계층에서작전중간 울음소리다오방법,다오계산은 캡슐화되어 있습니다MD5가치.도(道)방법JSP들어오는 문서들과 계산기MD5계산이 완료된 후에는 값의 원래 경로를 반환합니다작전이번이 처음으로 파일 계산이 이루어진 경우입니다MD5가치, 저장해 두세요회기, 두 번째 것과 비교할 수 있도록MD5가치관. 첫 번째 성공적인 처형 후, 다음으로 점프하세요성공페이지. 이제 파일을 두 번째로 시작하세요MD5계산도 위의 방법을 사용합니다. 계산 후MD5값 이후에는 두 번째 값이 계산됩니다MD5값은 처음 계산된 값과 같으며 저장됩니다.세션값이 같으면 변화가 없습니다. 만약 다르다면, 조작이 있었다는 뜻입니다.
시스템 구현
1단계,Index.jsp소스 코드
<!-- Index.jsp여기에 시스템 저장소에서 파일을 추가하세요-->
                <center>
                        <form action="fileCrypt" 메서드="get">
                                <table>
                                        <tr>
                                                <td>파일 이름:</td>
                                                <td><입력 유형="file" 이름="Md5FilesEntity.filename" />
                                                </td>
                                                <td><입력 유형="제출" 값="시작" />
                                                </td>
                                        </tr>
                                </table>
                        </form>
                </center>
2단계,스트럿구성 파일 내 소스 코드
<!-- 스트럿2구성 파일-->
<struts>
        <constant value="true" name="struts.devMode" />
        <constant value="zh_CN" name="struts.locale" />
        <constant value="utf-8" name="struts.i18n.encoding" />
       
        <패키지 이름="default" extends="struts-default">
                <action name="mdeAction" class="com.crypt.action.mdeAction"
                        method="codeCrype">
                        <결과 이름="성공">/index.jsp</result>
                </action>
                <action name="fileCrypt" 클래스="com.crypt.action.FilesCryptAction">
                        <결과 이름="성공">/success.jsp</result>
                </action>
                <action name="fileCrypt2" class="com.crypt.action.FilesCryptAction" 메서드="SetCrypt2">
                        <결과 이름="성공">/FilnallySuccess.jsp</result>
                        <결과 이름="fail">/fail.jsp</result>
                </action>
</struts>   
세 번째 단계는 struts2 다음에 FilesCryptAction으로 점프하는 것입니다
패키지 com.crypt.action;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpSession을 import;
import org.apache.struts2.ServletActionContext;
수입 com.crypt.dao.Md5_dao;
import com.opensymphony.xwork2.ActionSupport;
import com.crypt.entity.Md5FilesEntity;
public class FilesCryptAction은 ActionSupport {
        private Md5FilesEntity Md5FilesEntity = new Md5FilesEntity();
       
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        public Md5FilesEntity getMd5FilesEntity() {
                반환 Md5FilesEntity;
        }
        public void setMd5FilesEntity(Md5FilesEntity md5FilesEntity) {
                Md5FilesEntity = md5FilesEntity;
        }
        public String execute() throws IOException {
                문자열 파일코드 = null;
                시도해 {
                        fileCode = Md5_dao.getFileCode("e:" + Md5FilesEntity.getFilename());
                        session.setAttribute("fileCode", fileCode); //처음 계산된 경우는MD5이 값은 일시적으로 저장됩니다.세션보통
                } catch (예외 e) {
                        TODO 자동 생성 캐치 블록
                        e.printStackTrace();
                }
                Md5FilesEntity.setFileAfterHashCode1(fileCode);
                "성공"을 반환;
        }
        public String SetCrypt2() {
                문자열 fileCode2 = null;
                시도해 {
                        fileCode2 = Md5_dao
                                        .getFileCode("e:" + Md5FilesEntity.getFilename());
                } catch (예외 e) {
                        TODO 자동 생성 캐치 블록
                        e.printStackTrace();
                }
                Md5FilesEntity.setFileAfterHashCode2(fileCode2);
                System.out.println("session1"+session.getAttribute("fileCode"));
                if (fileCode2 .equals(session.getAttribute("fileCode"))) {
                        "성공"을 반환;
                } 그렇지 않으면 {
                        "실패"로 반환;
                }
        }
}
          
네 번째 단계에서는 액션이 값이 있는 Md5_dao으로 점프하기 시작합니다
패키지 com.crypt.dao;
수입 com.crypt.md5.Md5Crypt_1;
수입 com.crypt.md5.Md5Crypt_2;
공용 클래스 Md5_dao {
        public static String getFileCode(String fileName) throws Exception {
                System.out.println(fileName);
                String hashCode = Md5Crypt_1.getHash(파일명, "MD5");
                System.out.println(hashCode);
                해시코드를 반환;
        }
}       
다섯 번째 단계는 시스템에 파일의 MD5 값을 계산하는 API를 만들어 DAO에서 직접 호출하는 것이며, 이제 Md5Crypt_1 메서드에서 직접 처리됩니다
패키지 com.crypt.md5;
import java.io.*;
import java.security.*;
공공 클래스 Md5Crypt_1 {
        공개 정적 문자[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        public static void main(String[] args)이 Exception {
                문자열 파일명 = "e:/111.txt";
                문자열 해시타입 = "MD5";
                System.out.println(hashType + " == " + getHash(fileName, hashType));
        }
        공개 정적 문자열 getHash(String fileName, String hashType)
                        throws exception {
                InputStream fis;
                fis = new FileInputStream(fileName);
                byte[] 버퍼 = 새로운 byte[1024];
                MessageDigest md5 = MessageDigest.getInstance(hashType);
                int numRead = 0;
                while ((numRead = fis.read(buffer)) > 0) {
                        md5.update(buffer, 0, numRead);
                }
                fis.close();
                return to HexString(md5.digest());
        }
        public static String toHexString(byte[] b) {
                StringBuilder sb = 새로운 StringBuilder(b.length * 2); //문자열 생성기를 구성하고 지정된 문자열 내용으로 초기화하세요
                (정수: i = 0; 저는 B< 길이; i++) {
                        sb.append(hexChar[(b& 0xf0) >>>4]); 추가메서드는 항상 이 문자들을 생성기 끝에 추가합니다
                        sb.append(hexChar[b& 0x0f]);
                }
                sb.toString();
        }
}
6단계: 파일의 MD5 값을 성공적으로 계산한 후, 첫 번째 MD5가 세션 내 동작 중에 저장되고, struts2 구성 파일 구성을 통해 seccess.jsp으로 이동해 처음 계산된 MD5 값을 표시하고 두 번째 계산을 시작하라는 알림을 뜨세요:
Success.jsp 소스 코드:
<body>
   처음 계산된 경우는MD5값은 다음과 같습니다:
   <s:iterator value="Md5FilesEntity" id="Md5FilesEntity" status="L">
                <s:property value="#Md5FilesEntity.fileAfterHashCode1" />
        </s:반복자>
       
                <center>
                        <form action="fileCrypt2" method="get">
                                <table>
                                        <tr>
                                                <td>파일 이름:</td>
                                                <td><입력 유형="file" 이름="Md5FilesEntity.filename" />
                                                </td>
                                                <td><입력 유형="제출" 값="시작" />
                                                </td>
                                        </tr>
                                </table>
                        </form>
                        <form>
                                <textarea style="text-align: left; " rows="10" cols="41"
                                        readonly="readonly">
        <s:iterator value="Md5FilesEntity" id="Md5FilesEntity" status="L">
                <s:property value="#Md5FilesEntity.Md5FileCode" />
        </s:반복자>
        </textarea>
                        </form>
                </center>
  </body>
7단계: 두 번째 제출을 시작하고 계산하기MD5값은 위 과정에 따라 다시 계산한 후 두 번째로 계산됩니다MD5두 번이면 첫 번째 값과 비교됩니다MD5        동일하면 변조가 없다는 뜻입니다; 두 번이라도MD5만약 값이 다르다면, 문서가 조작된 것입니다. 이렇게 해서 전체 시스템이 완성된 것입니다.
문서 변조 방지 시스템 테스트
시스템을 거치대에 올려놓아토막트 6.0일어나서 깨달아라도망쳐. 아래는 시스템의 테스트 다이어그램입니다:
1단계: 계산해야 할 파일을 추가하세요. 그리고 단속을 강화하라"시작"계산 시작을 위한 버튼.

두 번째 단계는 계산됩니다MD5, insuccess.jsp첫 번째 계산된 값은MD5값, 그리고 디스플레이. 두 번째 계산도 조작되었는지 확인하기 위해 진행됩니다.

세 번째 단계는 문서를 조작하지 않고 두 번째 계산을 수행하는 것입니다MD5가치. 변조가 없다면, 이 점프가 없는 페이지가 바로 점프되며 "파일 변조되지 않았습니다"라는 문구가 표시됩니다. 만약 문서가 조작되었다면, 문서가 조작되었다는 것을 보여줍니다.



4단계: 파일을 변경하고 위 테스트를 반복합니다
첫 번째 계산:


계산이 성공한 후:

다섯 번째 단계는 문서를 고의로 조작하고 계산하는 것입니다. 원칙적으로 문서는 두 번 조작되고 계산됩니다MD5아니요, 비교할 때는 파일이 조작되었다는 알림이 뜨어야 합니다.


이 시점에서 전체 시스템의 테스트가 완료되었습니다.







이전의:우수 기업가 협회는 "폐기물 재활용, 자원 활용" 활동을 진행했습니다
다음:[C#] 12306 티켓 강탈의 근거 실현
게시됨 2014. 11. 20. 오후 2:13:20 |
박식한
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com