ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>openssl_windows



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 Windows ȯ°æ¿¡¼­ OpenSSL Ȱ¿ë
2 OpenSSL ¼Ò½º ¹Þ±â
2.1 OpenSSL »çÀÌÆ®
2.2 Download »çÀÌÆ®
3 ¼Ò½º ÆÄÀÏ ¾ÐÃà Ç®±â
4 ºôµåÇϱâ À§ÇØ ÇÊ¿äÇÑ Åø
4.1 Perl Interpreter
4.2 C Compilers
4.3 Assembler
5 ºôµåÀü Áغñ ÀÛ¾÷
5.1 Microsoft DDK ¼³Ä¡
5.2 perl win32 ¹öÀü ¼³Ä¡
5.3 Path µî·Ï
6 ºôµå
6.1 Visual C++
6.2 Mingw32
6.3 Cygwin
7 ¿¹Á¦ ÇÁ·Î±×·¥
7.1 °³¹ß¼ø¼­
7.2 6.2 ¼Ò½º ÄÚµå
7.3 ½Ç Çà
7.4 login.ini ÆÄÀÏ
7.5 ¼Ò½º ÄÚµå ´Ù¿î·Îµå
7.6 ÂüÁ¶ »çÀÌÆ®


1 Windows ȯ°æ¿¡¼­ OpenSSL Ȱ¿ë


ÀÛ¼ºÀÚ: mwyun(¸Û)

¸®´ª½º ȯ°æ¿¡¼­ÀÇ openssl°ü·Ã ³»¿ëÀº ´ÙÀ½ URLÀ» Âü°íÇϱ⠹ٶø´Ï´Ù -- yundream
  1. opensslÀ» ÀÌ¿ëÇÑ ÆÄÀÏ ¾Ïȣȭ

2 OpenSSL ¼Ò½º ¹Þ±â

2.1 OpenSSL »çÀÌÆ®

2.2 Download »çÀÌÆ®

    °¡Àå ÃֽйöÀüÀÎ 'openssl-0.9.7d.tar.gz' ¸¦ ´Ù¿î¹Þ´Â´Ù. 
 
    À©32 Ç÷§ÆûÀ» ºôµùÇÒ·Á¸é INSTALL.W32 ÆÄÀÏÀ» ÂüÁ¶ÇØ¾ß ÇÑ´Ù. 
    ÀÌ ¹®¼­´Â 'INSTALL.W32' ÆÄÀÏÀ» ÂüÁ¶ÇÏ¿© ÀÛ¼ºµÇ¾ú´Ù. 
 
    INSTALL.WCE ÆÄÀÏÀ» Àо¸é Windows CE¿ëÀ¸·Î ºôµùÇÏ´Â ¹æ¹ýÀÌ ³ª¿ÍÀÖ´Ù. 
    À̰ÍÀº ½±°Ô Windows CE¿ëÀ¸·Î opensslÀ» Æ÷ÆÃÇÒ ¼ö ÀÖÀ½À» È®ÀνÃÄÑÁÖ°í ÀÖ´Ù. 
 

3 ¼Ò½º ÆÄÀÏ ¾ÐÃà Ç®±â

  'openssl-0.9.7d.tar.gz'¸¦ 'C:\openssl-0.9.7d'¿¡ ¾ÐÃàǬ´Ù. 
 

4 ºôµåÇϱâ À§ÇØ ÇÊ¿äÇÑ Åø

4.1 Perl Interpreter

         cpan »çÀÌÆ® °¡º¸¸é perl win32¿ë ¹öÀüÀ» ãÀ» ¼ö ÀÖ´Ù. 
 
            »ó¿ëÀ̹ǷΠ»ç¿ëÇÏÁö ¾Ê´Â´Ù. 
 

        'SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe'ÆÄÀÏÀ» ´Ù¿î¹Þ´Â´Ù. 
        °ø°³ perl win32 ¹öÀü 
 

4.2 C Compilers

  • Visual C++
  • Borland C
  • GNU C (Mingw32 or Cygwin)

4.3 Assembler

  • Microsoft MASM (º°¸í "ml") <=== Microsoft Windows 2000 DDK¿¡¼­ Á¦°ø
  • Free Netwide Assembler NASM : nasmw

5 ºôµåÀü Áغñ ÀÛ¾÷

5.1 Microsoft DDK ¼³Ä¡

        Microsoft Windows 2000 DDK¸¦ ¼³Ä¡ÇÏÁö ¾Ê¾ÒÀ¸¸é www.msdn.com¿¡¼­ ´Ù¿î¹Þ¾Æ¼­ ¼³Ä¡ÇÑ´Ù. 
        À©µµ 2000ÀÎ °æ¿ì 2000¿ë DDK¸¦ ´Ù¿î¹Þ´Â´Ù. 
        ÀÚ¼¼ÇÑ ¼³Ä¡¹æ¹ýÀº ´ÙÀ½ ÆäÀÌÁö¸¦ ÂüÁ¶ÇÑ´Ù. 
 
Microsoft Windows 2000 DDK


5.2 perl win32 ¹öÀü ¼³Ä¡

    SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe¸¦ zipÀ» ÀÌ¿ëÇÏ¿© c:\perl µð·ºÅ丮¿¡ ¾ÐÃàǬ´Ù. 
    ´ÙÀ½°ú °°ÀÌ ¼­ºê µð·ºÅ丮°¡ »ý¼ºµÈ´Ù. 
         
    C:\perl\5.8.0\...      (lots of sub dirs) 
    C:\perl\site\5.8.0\...     (lots of sub dirs) 
 
   ÀÚ¼¼ÇÑ ¼³Ä¡ ¹æ¹ýÀº ´ÙÀ½ »çÀÌÆ®¸¦ ÂüÁ¶ÇÑ´Ù. 
 

5.3 Path µî·Ï

Ä¿¸Çµå »ó¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۱â À§ÇØ Path¸¦ µî·ÏÇÑ´Ù.



  • µî·Ï ¹æ¹ý
        ¹ÙÅÁ È­¸é > ³» ÄÄÇ»ÅÍ > ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư(ÆË¾÷¸Þ´º) > µî·Ï Á¤º¸ > °í±Þ > ȯ°æ º¯¼ö > ½Ã½ºÅÛ º¯¼ö > Path º¯¼ö ¼±Åà > ÆíÁý ¹öư Ŭ¸¯ 
        ´ÙÀ½ ¼¼°³ °æ·Î¸¦ µî·ÏÇÑ´Ù. 
             
        C:\NTDDK\bin <=== ml 
        C:\perl\5.8.0\bin <=== perl 
        C:\perl\5.8.0\bin\MSWin32-x86-perlio <=== perl 
 
        Ãß°¡ÇÒ ÅØ½ºÆ® : C:\perl\5.8.0\bin;C:\perl\5.8.0\bin\MSWin32-x86-perlio;C:\NTDDK\BIN <=== ';'À¸·Î Path¸¦ ±¸ºÐÇÑ´Ù. 
        ¼ÂÆÃ ÈÄ º¯¼ö °ª : C:\PROGRA~1\Borland\Delphi5\Projects\Bpl;C:\PROGRA~1\Borland\vbroker\jre\Bin;C:\PROGRA~1\Borland\vbroker\Bin;C:\PROGRA~1\Borland\Delphi5\Bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ESTsoft\ALZip\;C:\sourcenav\bin;C:\perl\5.8.0\bin;C:\perl\5.8.0\bin\MSWin32-x86-perlio;C:\NTDDK\BIN 
        È®ÀÎ ¹öưÀ» Ŭ¸¯ÇÏ¿© âÀ» ´Ý´Â´Ù. 
 


  • Å×½ºÆ®
         Ä¿¸Çµå âÀ» ¶Ù¾î¼­ ml, perlÀÌ ½ÇÇàµÇ´ÂÁö Å×½ºÆ®Çغ»´Ù. 
        ½ÃÀÛ > ½ÇÇà > "cmd"¶ó°í ÀÔ·ÂÇÏ°í ¿£ÅÍ 
        Ä¿¸Çµå âÀÌ ¶ß¸é ml or perl¸¦ ÀÔ·ÂÇÏ°í ¿£ÅÍ 
 

6 ºôµå

6.1 Visual C++

    ºôµå¸¦ À§ÇÏ¿© Visual C++¸¦ »ç¿ëÇÏ¿´´Ù. 
 
        Ä¿¸Çµå â ½ÇÇà 
        C:\>cd C:\openssl-0.9.7d 
 
  • Configure
        C:\openssl-0.9.7d>perl Configure VC-WIN32 
        Configuring for VC-WIN32 
        IsWindows=1 
        CC            =cl 
        CFLAG         =-DOPENSSL_SYSNAME_WIN32 -DOPENSSL_THREADS  -DDSO_WIN32 -DOPENSSL_NO_KRB5 
        EX_LIBS       = 
        BN_ASM        =bn_asm.o 
        DES_ENC       =des_enc.o fcrypt_b.o 
        BF_ENC        =bf_enc.o 
        CAST_ENC      =c_enc.o 
        RC4_ENC       =rc4_enc.o 
        RC5_ENC       =rc5_enc.o 
        MD5_OBJ_ASM   = 
        SHA1_OBJ_ASM  = 
        RMD160_OBJ_ASM= 
        PROCESSOR     = 
        RANLIB        =true 
        ARFLAGS       = 
        PERL          =perl 
        THIRTY_TWO_BIT mode 
        BN_LLONG mode 
        RC4_INDEX mode 
        RC4_CHUNK is undefined 
 
        Configured for VC-WIN32. 
 
  • Makefile »ý¼º
        MASMÀ» »ç¿ëÇÏ´Â °æ¿ì <=== »ç¿ëÇÏ¿´´Ù. 
        C:\openssl-0.9.7d>ms\do_masm  
        Generating x86 for MASM assember 
        Bignum 
        DES 
        "crypt(3)" 
        Blowfish 
        CAST5 
        RC4 
        MD5 
        SHA1 
        RIPEMD160 
        RC5\32 
 
        C:\openssl-0.9.7d>perl util\mkfiles.pl  1>MINFO 
 
        C:\openssl-0.9.7d>rem perl util\mk1mf.pl VC-MSDOS no-sock >ms\msdos.mak 
 
        C:\openssl-0.9.7d>rem perl util\mk1mf.pl VC-W31-32 >ms\w31.mak 
 
        C:\openssl-0.9.7d>perl util\mk1mf.pl dll VC-W31-32  1>ms\w31dll.mak 
 
        C:\openssl-0.9.7d>perl util\mk1mf.pl VC-WIN32  1>ms\nt.mak 
 
        C:\openssl-0.9.7d>perl util\mk1mf.pl dll VC-WIN32  1>ms\ntdll.mak 
 
        C:\openssl-0.9.7d>perl util\mkdef.pl 16 libeay  1>ms\libeay16.def 
 
        C:\openssl-0.9.7d>perl util\mkdef.pl 32 libeay  1>ms\libeay32.def 
 
        C:\openssl-0.9.7d>perl util\mkdef.pl 16 ssleay  1>ms\ssleay16.def 
 
        C:\openssl-0.9.7d>perl util\mkdef.pl 32 ssleay  1>ms\ssleay32.def 
 
        MASMÀ» »ç¿ëÇÒ·Á¸é DDK¸¦ ¼³Ä¡ÇؾßÇÑ´Ù. 
 
        NASMÀ» »ç¿ëÇÏ´Â °æ¿ì <=== »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. 
        C:\openssl-0.9.7d>ms\do_nasm  
 
  • Building
        C:\openssl-0.9.7d>nmake -f ms\ntdll.mak 
 
       ½ÇÇà°úÁ¤ »ý·«... 
                                 
                                
        out32dll µð·ºÅ丮¿¡ DLL ÆÄÀϵéÀÌ »ý¼ºµÈ´Ù. 
        »ý¼ºµÈ Á¤Àû/µ¿Àû ¶óÀ̺귯¸® ÆÄÀϵéÀ» È®ÀÎÇØº»´Ù. 
 
        C:\openssl-0.9.7d\out32dll>dir *.dll 
         C µå¶óÀ̺êÀÇ º¼·ý: ·ÎÄà µð½ºÅ© 
         º¼·ý ÀÏ·Ã ¹øÈ£: 0CB2-AF14 
 
         C:\openssl-0.9.7d\out32dll µð·ºÅ͸® 
 
        2004-04-18  06:17p             830,976 libeay32.dll 
        2004-04-18  06:17p             150,016 ssleay32.dll 
                       2°³ ÆÄÀÏ         980,992 ¹ÙÀÌÆ® 
                       0 µð·ºÅ͸®   5,091,676,160 ¹ÙÀÌÆ® ³²À½ 
 
        C:\openssl-0.9.7d\out32dll>dir *.lib 
         C µå¶óÀ̺êÀÇ º¼·ý: ·ÎÄà µð½ºÅ© 
         º¼·ý ÀÏ·Ã ¹øÈ£: 0CB2-AF14 
 
        C:\openssl-0.9.7d\out32dll µð·ºÅ͸® 
 
        2004-04-18  06:17p           1,421,450 libeay32.lib 
        2004-04-18  06:17p             115,488 ssleay32.lib 
                       2°³ ÆÄÀÏ       1,536,938 ¹ÙÀÌÆ® 
                       0 µð·ºÅ͸®   5,091,676,160 ¹ÙÀÌÆ® ³²À½ 
 
        »ý¼ºµÈ ÆÄÀÏÁß¿¡¼­ ¾îÇø®ÄÉÀÌ¼Ç °³¹ß¿¡  ÇÊ¿äÇÑ ¶óÀ̺귯¸® ÆÄÀÏ ¸ñ·Ï 
            ssleay32.lib 
            libeay32.lib 
            ssleay32.dll 
            libeay32.dll 
 
          
 
  • Test
        Á¤»óÀûÀ¸·Î Á¤Àû/µ¿Àû ¶óÀ̺귯¸®°¡ »ý¼ºµÇ¾úÀ¸¸é ´ÙÀ½ Å×½ºÆ®´Â Á¤»ó ½ÇÇàµÈ´Ù. 
 
        C:\openssl-0.9.7d>cd out32dll 
        C:\openssl-0.9.7d\out32dll>..\ms\test 
                                
        ½ÇÇà°úÁ¤ »ý·«... 
        passed all tests <=== ÀÌ ¸Þ½ÃÁö°¡ ³ª¿À¸é ¸ðµç Å×½ºÆ®°¡ ¼º°øÇÑ °ÍÀÔ´Ï´Ù. 
 

6.2 Mingw32

        msvcrt.dll or crtdll.dll ÆÄÀϰú ¸µÅ©ÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Â ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÒ·Á¸é gcc-2.95.2-msvcrt.exe¸¦ ´Ù¿î¹Þ´Â´Ù. 
        gcc-2.95.2-msvcrt.exeÀº msvcrt.dll or crtdll.dll ÆÄÀϰú ¸µÅ©ÇÏ¿© ½ÇÇàÇÏ´Â ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÑ´Ù. 
        ´ÙÀ½ ÅøÀ» ´Ù¿î¹Þ¾Æ¼­ ¼³Ä¡ÇÑ´Ù. 
 
        ±âÁ¸¿¡ ¼³Ä¡µÈ Mingw32 µð·ºÅ丮¸¦ ã¾Æ¼­ bin ¹Ø¿¡ gcc-2.95.2-msvcrt.exeÀ» º¹»çÇÑ´Ù.     
        ===> C:\gcc-2.95.2\bin 
             
        Path µî·Ï          
        ===> C:\gcc-2.95.2\mingw32.bat ¶Ç´Â À©µµ¿ì ½Ã½ºÅÛ ¼Ó¼º 
 

6.3 Cygwin

        CygwinÀº cygwin1.dllÀ» ÅëÇÏ¿© POSIX/UNIXÀ» ±¸ÇöÇÏ¿´À¸¹Ç·Î CygwinÀ¸·Î ºôµùµÈ openssl ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÒ·Á¸é cygwin1.dllµµ °°ÀÌ ¹èÆ÷ÇØ¾ßÇÏ´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. 
        ¸¸¾à Windows CE¿ëÀ¸·Î opensslÀ» ºôµùÇÏ´Â °æ¿ì cygwin1.dllµµ ºôµùÇØ¾ßÇϹǷΠºÎ°¡ÀûÀÎ ÀÛ¾÷ÀÌ µé¹Ç·Î CygwinÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. 
 

7 ¿¹Á¦ ÇÁ·Î±×·¥


ºôµåÇÑ openssl library¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» °³¹ßÇØº»´Ù.

7.1 °³¹ß¼ø¼­


  • VC++ IDE¸¦ ½ÇÇàÇÑ´Ù.
    1. ÇÁ·ÎÁ§Æ® ¸¸µé±â
       File > New ¸Þ´º¸¦ ¼±ÅÃÇϰí Projects ÅÇ¿¡¼­ "MFC AppWizard(exe)"¸¦ ¼±ÅÃÇÑ´Ù.  
       Project name: login   
       Location: C:\login <- C:\ÀÎ °æ¿ì ÇÁ·ÎÁ§Æ® À̸§À¸·Î µð·ºÅ丮°¡ ¸¸µé¾îÁø´Ù.  
       OK ¹öưÀ» Ŭ¸¯ÇÑ´Ù. 
     
    login_1.jpg
       MFC AppWizard - Step1: Dialog base¸¦ ¼±ÅÃÇÑ´Ù. 
     
    login_2.jpg
       MFC AppWizard - Setp2 of 4: Next ¹öưÀ» Ŭ¸¯ÇÑ´Ù. 
     
    login_3.jpg
       MFC AppWizard - Setp3 of 4: Next ¹öưÀ» Ŭ¸¯ÇÑ´Ù. 
     
    login_4.jpg
       MFC AppWizard - Setp4 of 4: Finish ¹öưÀ» Ŭ¸¯ÇÑ´Ù. 
     
    login_5.jpg
       New Project Infomation: OK ¹öưÀ» Ŭ¸¯ÇÑ´Ù. 
     
    login_6.jpg
    1. ¼Ò½º ÄÚµå ÀÛ¼º
       '''6.2 ¼Òµå ÄÚµå'''¸¦ ÂüÁ¶ÇÑ´Ù. 
     
    1. ÇÁ·ÎÁ§Æ® ¼ÂÆÃ
      • Çì´õ ÆÄÀÏ °æ·Î µî·Ï
          Project > Settings¸¦ ¼±ÅÃÇϰí C/C++ ÅÇÀ» ¼±ÅÃÇÑ´Ù.  
          Preprocessor¸¦ ¼±ÅÃÇϰí "Additional include directories"¿¡ ".\\include"¸¦ Ãß°¡ÇÑ´Ù. 
     
    • ¶óÀ̺귯¸® ÆÄÀÏ °æ·Î µî·Ï
          Project > Settings¸¦ ¼±ÅÃÇϰí Link ÅÇÀ» ¼±ÅÃÇÑ´Ù. 
          InputÀ» ¼±ÅÃÇϰí "Object/library modules"¿¡ "libeay32.lib ssleay32.lib"À» ÀÔ·ÂÇÑ´Ù.  
     
    1. Çì´õ/¶óÀ̺귯¸® ÆÄÀÏ º¹»ç
         C:\login\incldue¿¡ openssl Çì´õ ÆÄÀÏ Æú´õ¸¦ º¹»çÇÑ´Ù. 
         C:\openssl-0.9.7d\inc32\openssl => C:\login\incldue\openssl 
         C:\login¿¡ libeay32.lib, ssleay32.libÀ» º¹»çÇÑ´Ù. 
         C:\openssl-0.9.7d\out32dll\*.lib => C:\login 
     
    1. ÄÄÆÄÀÏ
         Build > Execute login.exe or Ctrl+F5 
     
    1. µð¹ö±ë

      7.2 6.2 ¼Ò½º ÄÚµå


    loginDlg.h

    // loginDlg.h : header file 
    // 
     
    #if !defined(AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_) 
    #define AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_ 
     
    #include "SetupDlg.h" 
    #include "MD5.h" 
     
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CLoginDlg dialog 
     
    class CLoginDlg : public CDialog 
    { 
    // Construction 
    public: 
        UINT m_nFailCount; 
        BOOL Login(void); 
        CMD5 md5; 
        CLoginDlg(CWnd* pParent = NULL);    // standard constructor 
     
    // Dialog Data 
        //{{AFX_DATA(CLoginDlg) 
        enum { IDD = IDD_LOGIN_DIALOG }; 
        CString    m_Id; 
        CString    m_Password; 
        //}}AFX_DATA 
     
        // ClassWizard generated virtual function overrides 
        //{{AFX_VIRTUAL(CLoginDlg) 
        protected: 
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
        //}}AFX_VIRTUAL 
     
    // Implementation 
    protected: 
        HICON m_hIcon; 
     
        // Generated message map functions 
        //{{AFX_MSG(CLoginDlg) 
        virtual BOOL OnInitDialog(); 
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 
        afx_msg void OnPaint(); 
        afx_msg HCURSOR OnQueryDragIcon(); 
        virtual void OnOK(); 
        afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); 
        //}}AFX_MSG 
        DECLARE_MESSAGE_MAP() 
    }; 
     
    //{{AFX_INSERT_LOCATION}} 
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 
     
    #endif // !defined(AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_) 
     

    loginDlg.cpp

    // loginDlg.cpp : implementation file 
    // 
     
    #include "stdafx.h" 
    #include "login.h" 
    #include "loginDlg.h" 
    #include "SetupDlg.h" 
     
    #ifdef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
    #endif 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CAboutDlg dialog used for App About 
     
    class CAboutDlg : public CDialog 
    { 
    public: 
        CAboutDlg(); 
     
    // Dialog Data 
        //{{AFX_DATA(CAboutDlg) 
        enum { IDD = IDD_ABOUTBOX }; 
        //}}AFX_DATA 
     
        // ClassWizard generated virtual function overrides 
        //{{AFX_VIRTUAL(CAboutDlg) 
        protected: 
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
        //}}AFX_VIRTUAL 
     
    // Implementation 
    protected: 
        //{{AFX_MSG(CAboutDlg) 
        //}}AFX_MSG 
        DECLARE_MESSAGE_MAP() 
    }; 
     
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
    { 
        //{{AFX_DATA_INIT(CAboutDlg) 
        //}}AFX_DATA_INIT 
    } 
     
    void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
    { 
        CDialog::DoDataExchange(pDX); 
        //{{AFX_DATA_MAP(CAboutDlg) 
        //}}AFX_DATA_MAP 
    } 
     
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
        //{{AFX_MSG_MAP(CAboutDlg) 
            // No message handlers 
        //}}AFX_MSG_MAP 
    END_MESSAGE_MAP() 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CLoginDlg dialog 
     
    CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/) 
        : CDialog(CLoginDlg::IDD, pParent) 
    { 
        //{{AFX_DATA_INIT(CLoginDlg) 
        m_Id = _T(""); 
        m_Password = _T(""); 
        //}}AFX_DATA_INIT 
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    } 
     
    void CLoginDlg::DoDataExchange(CDataExchange* pDX) 
    { 
        CDialog::DoDataExchange(pDX); 
        //{{AFX_DATA_MAP(CLoginDlg) 
        DDX_Text(pDX, IDC_EDIT1, m_Id); 
        DDV_MaxChars(pDX, m_Id, 20); 
        DDX_Text(pDX, IDC_EDIT2, m_Password); 
        DDV_MaxChars(pDX, m_Password, 20); 
        //}}AFX_DATA_MAP 
    } 
     
    BEGIN_MESSAGE_MAP(CLoginDlg, CDialog) 
        //{{AFX_MSG_MAP(CLoginDlg) 
        ON_WM_SYSCOMMAND() 
        ON_WM_PAINT() 
        ON_WM_QUERYDRAGICON() 
        ON_WM_SHOWWINDOW() 
        //}}AFX_MSG_MAP 
    END_MESSAGE_MAP() 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CLoginDlg message handlers 
     
    BOOL CLoginDlg::OnInitDialog() 
    { 
        CDialog::OnInitDialog(); 
         
        // Add "About..." menu item to system menu. 
     
        // IDM_ABOUTBOX must be in the system command range. 
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
        ASSERT(IDM_ABOUTBOX < 0xF000); 
     
        CMenu* pSysMenu = GetSystemMenu(FALSE); 
        if (pSysMenu != NULL) 
        { 
            CString strAboutMenu; 
            strAboutMenu.LoadString(IDS_ABOUTBOX); 
            if (!strAboutMenu.IsEmpty()) 
            { 
                pSysMenu->AppendMenu(MF_SEPARATOR); 
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
            } 
        } 
     
        // Set the icon for this dialog.  The framework does this automatically 
        //  when the application's main window is not a dialog 
        SetIcon(m_hIcon, TRUE);            // Set big icon 
        SetIcon(m_hIcon, FALSE);        // Set small icon 
         
        // TODO: Add extra initialization here 
        m_nFailCount = 0; 
        CString inifile; 
        inifile.Format(".\\%s.ini", AfxGetApp()->m_pszAppName); 
        md5.SetIniFile(inifile); 
         
        if (!md5.GetINIData()) 
        { 
            AfxMessageBox("¼³Á¤Á¤º¸¸¦ Àдµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù."); 
     
            CSetupDlg dlg; 
            CString str; 
            int nResponse = dlg.DoModal(); 
            if (nResponse == IDOK) 
                str.Format("¾ÆÀ̵ð/ÆÐ½º¿öµå¸¦ ÀúÀåÇÏ¿´½À´Ï´Ù.\n´Ù½Ã ÇÁ·Î±×·¥À» ½ÃÀÛÇϼ¼¿ä!"); 
            else if (nResponse == IDCANCEL) 
                str.Format("¾ÆÀ̵ð/ÆÐ½º¿öµå¸¦ ÀúÀåÇÏÁö ¾Ê¾Ò½À´Ï´Ù.\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."); 
            AfxMessageBox(str); 
             
            CDialog::OnOK(); // return FALSE; 
        } 
     
        return TRUE;  // return TRUE  unless you set the focus to a control 
    } 
     
    void CLoginDlg::OnSysCommand(UINT nID, LPARAM lParam) 
    { 
        if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
        { 
            CAboutDlg dlgAbout; 
            dlgAbout.DoModal(); 
        } 
        else 
        { 
            CDialog::OnSysCommand(nID, lParam); 
        } 
    } 
     
    // If you add a minimize button to your dialog, you will need the code below 
    //  to draw the icon.  For MFC applications using the document/view model, 
    //  this is automatically done for you by the framework. 
     
    void CLoginDlg::OnPaint()  
    { 
        if (IsIconic()) 
        { 
            CPaintDC dc(this); // device context for painting 
     
            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
     
            // Center icon in client rectangle 
            int cxIcon = GetSystemMetrics(SM_CXICON); 
            int cyIcon = GetSystemMetrics(SM_CYICON); 
            CRect rect; 
            GetClientRect(&rect); 
            int x = (rect.Width() - cxIcon + 1) / 2; 
            int y = (rect.Height() - cyIcon + 1) / 2; 
     
            // Draw the icon 
            dc.DrawIcon(x, y, m_hIcon); 
        } 
        else 
        { 
            CDialog::OnPaint(); 
        } 
    } 
     
    // The system calls this to obtain the cursor to display while the user drags 
    //  the minimized window. 
    HCURSOR CLoginDlg::OnQueryDragIcon() 
    { 
        return (HCURSOR) m_hIcon; 
    } 
     
    void CLoginDlg::OnOK()  
    { 
        // TODO: Add extra validation here 
        if (Login()) // ·Î±×ÀÎ ¼º°ø 
            CDialog::OnOK(); 
        else // ·Î±×ÀÎ ½ÇÆÐ 
        { 
            m_nFailCount++; // ½ÇÆÐ Ä«¿îÆ® Áõ°¡ 
            if (m_nFailCount >= 3) 
            { 
                CString str; 
                str.Format("3¹ø ÀÌ»ó À߸ø ÀÔ·ÂÇÏ¿´½À´Ï´Ù.\n´Ù½Ã ÇÁ·Î±×·¥À» ½ÃÀÛÇϼ¼¿ä!"); 
                AfxMessageBox(str); 
                CDialog::OnOK(); 
            } 
     
            m_Id = ""; 
            m_Password = ""; 
            UpdateData(FALSE); 
            ((CEdit *)GetDlgItem(IDC_EDIT1))->SetFocus(); 
        } 
    } 
     
    BOOL CLoginDlg::Login() 
    { 
        char *encrypt_password = NULL; 
     
        UpdateData(TRUE); 
         
        if (md5.GetId() != m_Id)  
        { 
            AfxMessageBox("¾ÆÀ̵𰡠´Ù¸§´Ï´Ù."); 
            return FALSE; 
        } 
     
        if (md5.GetMD5()) // md5 ¾Ïȣȭ 
        { 
            //m_Password¸¦ md5 ¾Ïȣȭ ÇÑ´Ù. 
            encrypt_password = md5.DigestMsg(m_Password.GetBuffer(m_Password.GetLength())); // Digest Data 
            m_Password.Format("%s", encrypt_password); 
        } 
     
    #if _DEBUG 
        CString Password = md5.GetPassword(); 
        TRACE("%s, %d\n%s, %d\n", Password, Password.GetLength(), m_Password, m_Password.GetLength()); 
    #endif 
     
        if (md5.GetPassword() != m_Password) 
        { 
            AfxMessageBox("¾ÏÈ£°¡ ´Ù¸§´Ï´Ù."); 
            if (encrypt_password) 
                free(encrypt_password); 
            return FALSE; 
        } 
     
        AfxMessageBox("·Î±×Àο¡ ¼º°øÇÏ¿´½À´Ï´Ù."); 
        if (encrypt_password) 
            free(encrypt_password); 
     
        return TRUE; 
    } 
     
    void CLoginDlg::OnShowWindow(BOOL bShow, UINT nStatus)  
    { 
        CDialog::OnShowWindow(bShow, nStatus); 
         
        // TODO: Add your message handler code here 
        ((CEdit *)GetDlgItem(IDC_EDIT1))->SetFocus(); 
    } 
     

    SetupDlg.h

    #if !defined(AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_) 
    #define AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_ 
     
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
    // SetupDlg.h : header file 
    // 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CSetupDlg dialog 
     
    class CSetupDlg : public CDialog 
    { 
    // Construction 
    public: 
        CSetupDlg(CWnd* pParent = NULL);   // standard constructor 
    // Dialog Data 
        //{{AFX_DATA(CSetupDlg) 
        enum { IDD = IDD_SETUP_DIALOG }; 
        BOOL    m_md5; 
        CString    m_Id; 
        CString    m_Password; 
        //}}AFX_DATA 
     
     
    // Overrides 
        // ClassWizard generated virtual function overrides 
        //{{AFX_VIRTUAL(CSetupDlg) 
        protected: 
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
        //}}AFX_VIRTUAL 
     
    // Implementation 
    protected: 
     
        // Generated message map functions 
        //{{AFX_MSG(CSetupDlg) 
        virtual void OnOK(); 
        afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); 
        //}}AFX_MSG 
        DECLARE_MESSAGE_MAP() 
    }; 
     
    //{{AFX_INSERT_LOCATION}} 
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 
     
    #endif // !defined(AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_) 
     

    SetupDlg.cpp

    // SetupDlg.cpp : implementation file 
    // 
     
    #include "stdafx.h" 
    #include "login.h" 
    #include "SetupDlg.h" 
    #include "md5.h" 
     
    #ifdef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
    #endif 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CSetupDlg dialog 
     
     
    CSetupDlg::CSetupDlg(CWnd* pParent /*=NULL*/) 
        : CDialog(CSetupDlg::IDD, pParent) 
    { 
        //{{AFX_DATA_INIT(CSetupDlg) 
        m_md5 = FALSE; 
        m_Id = _T(""); 
        m_Password = _T(""); 
        //}}AFX_DATA_INIT 
    } 
     
     
    void CSetupDlg::DoDataExchange(CDataExchange* pDX) 
    { 
        CDialog::DoDataExchange(pDX); 
        //{{AFX_DATA_MAP(CSetupDlg) 
        DDX_Check(pDX, IDC_CHECK1, m_md5); 
        DDX_Text(pDX, IDC_EDIT11, m_Id); 
        DDV_MaxChars(pDX, m_Id, 20); 
        DDX_Text(pDX, IDC_EDIT22, m_Password); 
        DDV_MaxChars(pDX, m_Password, 20); 
        //}}AFX_DATA_MAP 
    } 
     
     
    BEGIN_MESSAGE_MAP(CSetupDlg, CDialog) 
        //{{AFX_MSG_MAP(CSetupDlg) 
        ON_WM_SHOWWINDOW() 
        //}}AFX_MSG_MAP 
    END_MESSAGE_MAP() 
     
    ///////////////////////////////////////////////////////////////////////////// 
    // CSetupDlg message handlers 
     
    void CSetupDlg::OnOK()  
    { 
        // TODO: Add extra validation here 
     
        UpdateData(TRUE); 
     
        if (m_Id == "") 
        { 
            ((CEdit *)GetDlgItem(IDC_EDIT11))->SetFocus(); 
            return; 
        } 
        else if (m_Password == "") 
        { 
            ((CEdit *)GetDlgItem(IDC_EDIT22))->SetFocus(); 
            return; 
        } 
     
        CMD5 md5; 
        CString inifile; 
        inifile.Format(".\\%s.ini", AfxGetApp()->m_pszAppName); 
        md5.SetIniFile(inifile); 
        md5.SetId(m_Id); 
        md5.SetPassword(m_Password); 
        md5.SetMD5(m_md5); 
        md5.SetINIData(); 
         
        CDialog::OnOK(); 
        //DestroyWindow(); 
    } 
     
    void CSetupDlg::OnShowWindow(BOOL bShow, UINT nStatus)  
    { 
        CDialog::OnShowWindow(bShow, nStatus); 
         
        // TODO: Add your message handler code here 
        ((CEdit *)GetDlgItem(IDC_EDIT11))->SetFocus(); 
    } 
     

    MD5.h

    // MD5.h: interface for the CMD5 class. 
    // 
    ////////////////////////////////////////////////////////////////////// 
     
    #if !defined(AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_) 
    #define AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_ 
     
    #include <openssl/evp.h> 
     
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
     
    class CMD5   
    { 
    public: 
        CMD5(); 
        BOOL GetINIData(); 
        void SetINIData(); 
        CString GetId() { return m_Id; }; 
        CString GetPassword() { return m_Password; }; 
        void SetId(CString id) { m_Id = id; }; 
        void SetPassword(CString password) { m_Password = password; }; 
        CString StringToMD5(CString str); 
        BOOL GetMD5() { return m_bMD5; }; 
        void SetMD5(BOOL md5) { m_bMD5 = md5; } 
        void SetIniFile(CString inifile) { m_IniFile = inifile; }; 
        CString GetIniFile() { return m_IniFile; }; 
        char *DigestMsg(char *mess); 
        void PrintDigestMsg(unsigned char *mess, int len); 
        char CharToHex(char ch); 
        void StrToHex(char *str, unsigned char *new_str); 
        virtual ~CMD5(); 
     
    private: 
        CString m_Id; 
        CString m_Password; 
        CString m_IniFile; 
        BOOL m_bMD5; 
     
    }; 
     
    #endif // !defined(AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_) 
     

    MD5.cpp

    // MD5.cpp: implementation of the CMD5 class. 
    // 
    ////////////////////////////////////////////////////////////////////// 
     
    #include "stdafx.h" 
    #include "login.h" 
    #include "MD5.h" 
    #include <string.h> 
    //#include <openssl/evp.h> 
     
    #ifdef _DEBUG 
    #undef THIS_FILE 
    static char THIS_FILE[]=__FILE__; 
    #define new DEBUG_NEW 
    #endif 
     
    ////////////////////////////////////////////////////////////////////// 
    // Construction/Destruction 
    ////////////////////////////////////////////////////////////////////// 
     
    CMD5::CMD5() 
    { 
    } 
     
    CMD5::~CMD5() 
    { 
     
    } 
     
    BOOL CMD5::GetINIData() 
    { 
        int md5; 
        DWORD dwLen; 
        char password[128]; 
        char id[128]; 
     
        md5 = ::GetPrivateProfileInt("setup", "md5", 0, m_IniFile); 
        ::GetPrivateProfileString("setup", "id", NULL, id, 128, m_IniFile); 
        dwLen = ::GetPrivateProfileString("setup", "password", NULL, password, 128, m_IniFile); 
     
        m_bMD5 = md5; 
        m_Id.Format("%s", id); 
        m_Password.Format("%s", password); 
     
    #if _DEBUG 
        TRACE("%d, %s, %s, %d\n", md5, id, password, dwLen); 
        PrintDigestMsg((unsigned char *)password, dwLen); 
    #endif 
     
        if (m_bMD5 == 0 && m_Id == "" && m_Password == "") 
        { 
            return FALSE; 
        } 
     
        return TRUE; 
    } 
     
    void CMD5::SetINIData() 
    { 
        CString str; 
        str.Format("%d", m_bMD5); 
        ::WritePrivateProfileString("setup", "md5", str, m_IniFile); 
        ::WritePrivateProfileString("setup", "id", m_Id, m_IniFile); 
     
        if (m_bMD5) // md5 ¾Ïȣȭ ÇØ¼­ ÀúÀå 
        { 
            char *encrypt_password = DigestMsg(m_Password.GetBuffer(m_Password.GetLength())); // Digest Data 
     
    #if _DEBUG 
                TRACE("%s, %d\n", encrypt_password, strlen(encrypt_password)); 
    #endif 
            ::WritePrivateProfileString("setup", "password", encrypt_password, m_IniFile); 
            free(encrypt_password); 
        } 
        else // plain text·Î ÀúÀå 
        { 
            ::WritePrivateProfileString("setup", "password", m_Password, m_IniFile); 
        } 
    } 
     
     
    // URL: http://www.openssl.org/docs/crypto/EVP_DigestInit.html 
    char *CMD5::DigestMsg(char *mess) 
    { 
      EVP_MD_CTX mdctx; 
      const EVP_MD *md; 
      int md_len; // digest data length 
      unsigned char md_value[EVP_MAX_MD_SIZE]; // Saved digest data 
      unsigned char encrypt_password[128]; 
     
      if (m_Password == "") 
          return ""; 
     
      OpenSSL_add_all_digests(); 
     
      md = EVP_get_digestbyname("md5"); 
      if (!md) 
      { 
          AfxMessageBox("Unknown message digest md5"); 
          return ""; 
      }  
     
      EVP_MD_CTX_init(&mdctx); 
      EVP_DigestInit_ex(&mdctx, md, NULL); 
      EVP_DigestUpdate(&mdctx, mess, strlen(mess)); // digest data 
      EVP_DigestFinal_ex(&mdctx, md_value, (unsigned int *)&md_len); 
      EVP_MD_CTX_cleanup(&mdctx); 
     
      md_value[md_len] = '\0'; // ²¿¿Á ³Ö¾îÁØ´Ù. 
      // 16Áø¼ö ÇüÅ·Πº¯È¯ 
      StrToHex((char *)md_value, encrypt_password); 
     
    #if _DEBUG 
      TRACE("md_len=%d\n", md_len); 
      PrintDigestMsg(md_value, md_len); 
      TRACE("md_value=%s\n", md_value); 
    #endif 
     
      return _strdup((char *)encrypt_password); 
    } 
     
    void CMD5::PrintDigestMsg(unsigned char *mess, int len) 
    { 
        int i; 
     
        for (i =0; i < len; i++) 
        { 
            TRACE("%02x", mess[i]); 
        } 
        TRACE("\n"); 
    } 
     
    char CMD5::CharToHex(char ch)  
    {  
        char hex;  
     
        if (ch >= 0 && ch <= 9)  
            hex = ch - 0 + '0';  
        else if (ch >= 10 && ch <= 15)  
            hex = ch - 10 + 'a';  
     
        return hex;  
    } 
     
    void CMD5::StrToHex(char *str, unsigned char *new_str)  
    {  
        int i, j;  
     
        i = 0;  
        j = 0;  
        while (i < strlen(str))  
        {  
            unsigned char ch; 
     
            // »óÀ§ 4ºñÆ®  
            ch = (str[i] >> 4) & 0x0f; 
            new_str[j] = CharToHex(ch);  
            j++; 
     
            // ÇÏÀ§ 4ºñÆ®  
            ch = str[i] & 0x0f; 
            new_str[j] = CharToHex(ch);  
            j++; 
            i++; 
        }  
        new_str[j] = '\0'; 
    } 
     

    7.3 ½Ç Çà


    1. µ¿Àû ¶óÀ̺귯¸® ÆÄÀÏ º¹»ç
      libeay32.dll, ssleay32.dllÀÌ login ÇÁ·Î±×·¥ µð·ºÅ丮¿¡ ÀÖ´øÁö ¾Æ´Ï¸é À©µµ¿ì ½Ã½ºÅÛ µð·ºÅ丮¿¡ À§Ä¡ÇؾßÇÑ´Ù.
    2. ½±°Ô libeay32.dll, ssleay32.dll ÆÄÀÏÀ» C:\login\debug µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.
      C:\login¿¡ libeay32.dll, ssleay32.dllÀ» º¹»çÇÑ´Ù.
      C:\openssl-0.9.7d\out32dll\*.dll => C:\login\debug
    3. Ž»ö±â¸¦ ½ÇÇàÇÏ¿© "C:\login\debug"·Î À̵¿ÇÑ´Ù.
    4. login.exe¸¦ ½ÇÇàÇÑ´Ù.
      1. login.ini ÆÄÀÏÀÌ ¾ø´Â °æ¿ì

      ¿¡·¯ ¸Þ½ÃÁö Ãâ·Â   
     
    login_exe_1.jpg
      ·Î±×ÀÎ Á¤º¸ ¼³Á¤ 
      ÆÐ½º¿öµå¸¦ MD5·Î ¾ÏÈ£È­ÇØ¼­ ÀúÀåÇÒ·Á¸é "MD5 ¾Ïȣȭ"¸¦ üũÇÑ´Ù. 
     
    login_exe_2.jpg
      ¾Ë¸² ¸Þ½ÃÁö 
     
    login_exe_3.jpg

    1. login.ini ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì

      ·Î±×ÀÎ ´ëÈ­»óÀÚ 
     
    login_exe_4.jpg
       ¾ÆÀ̵𰡠Ʋ¸° °æ¿ì ¾Ë¸² ¸Þ½ÃÁö Ãâ·Â 
     
    login_exe_6.jpg
       ¾ÏÈ£°¡ Ʋ¸° °æ¿ì ¾Ë¸² ¸Þ½ÃÁö Ãâ·Â 
     
    login_exe_5.jpg
      3¹ø ÀÌ»ó id ¶Ç´Â password¸¦ À߸ø ÀÔ·ÂÇÑ °æ¿ì ÇÁ·Î±×·¥À» Á¾·á½ÃŲ´Ù. 
     
    login_exe_7.jpg
       ·Î±×Àο¡ ¼º°øÇÑ ¾Ë¸² ¸Þ½ÃÁö Ãâ·Â 
       È®ÀÎ ¹öưÀ» Ŭ¸¯Çϸé ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 
     
    login_exe_8.jpg

    7.4 login.ini ÆÄÀÏ


  • md5 ¾ÏȣȭÇÑ ÆÐ½º¿öµå ÀúÀå login.ini ÆÄÀÏ
  •   [setup] 
      md5=1 <= 1À̸é password°¡ md5 ¾Ïȣȭ µÇ¾úÀ½À» ÀÇ¹Ì 
      id=mwyun <= id 
      password=63f4dbbe4608cdc6c0912f94ddf4a12c <= md5 ¾ÏȣȭµÈ °ÍÀ» 16Áø¼ö ÇüÅ·ΠÀúÀå 
     

    1. plain text·Î ÆÐ½º¿öµå ÀúÀå login.ini ÆÄÀÏ
      [setup] 
      md5=0 <= 0À̸é password°¡ plain textÀÓÀ» ÀÇ¹Ì 
      id=mwyun <= id 
      password=yun934 
     

    7.5 ¼Ò½º ÄÚµå ´Ù¿î·Îµå

  • login.zip

    7.6 ÂüÁ¶ »çÀÌÆ®


      ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ md5 ÄÚµå´Â ´ÙÀ½ »çÀÌÆ®¸¦ ÂüÁ¶ÇÏ¿© ÀÛ¼ºÇÏ¿´´Ù. 
      ÀÚ¼¼ÇÑ °Ç ¹®¼­¸¦ ÂüÁ¶ÇÑ´Ù. 
     
  • EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.