'암호화'에 해당되는 글 2건

  1. 2009/05/01 Silverlight 서버전송메시지 보안방법
  2. 2008/10/30 BeginRequest,PreSendRequestHeaders를 사용하여 쿠키암호화
2009/05/01 03:50

Silverlight 서버전송메시지 보안방법

잠이안와서 컴터를 키고 드라마를 보던중 불현듯...
실버라이트를 사용한 SSL통신 비스므리한 아이디어가 생각나서 적어봅니다..

네고시에이션
1. 세션 생성시에 해당세션에 해당되는 비대칭키를 서버에서 생성해서 세션에 서버의 개인키를 보존
2. 공개키를 클라이언트에 전송(HTML에 집어넣든..Silverlight상에서 수신하든..)
3. 클라이언트는 비대칭키를 생성해서 자신의 공개키를 서버에 전송(서버의 공개키로 암호화해서)
4. 서버는 세션에 클라이언트의 공개키를 보존
5. 클라이언트는 자신의 개인키를 보존. 보존시에는 페이지이동을 고려해야함..
    (문제는 클라이언트자신의 개인키를 어디에 보존하느냐??? IsolatedStorage가 사용가능하려나)

암호화 전송시(개인정보,패스워드등)
5. 클라이언트가 서버에 데이터 전송시에 자신의 개인키+서버의 공개키로 암호화해서 전송
6. 서버는 클라이언트에게 서버의 개인키+클라이언트의 공개키로 암호화해서 데이터전송

일반적인 비대칭암호화통신의 방법이지만 먼가뿌듯한 이느낌..-.-;;;

물론 실버라이트랑 서버간의 통신이 대부분 WCF나 Webservice로 이루어지니까
일괄적인 보안설정을 하면되지만.. 보안설정하는것도 꽤 많은 지식과 노력을 요하게되니..
위 기능을 구현한 간단한 컴퍼넌트가 있으면 꽤 좋을듯..

어쨋든 세션당 키가 생성되니 일반적인 웹사이트에서 사용하기에는 충분한 보안레벨인듯..
게다가 javascript연동기능도 만들면 궂이 silverlight로 UI를 만들지 않아도 암호화 가능하다는 사실..

혹시 공개된거 있을려나???

저작자 표시 비영리 변경 금지
Trackback 0 Comment 0
2008/10/30 23:14

BeginRequest,PreSendRequestHeaders를 사용하여 쿠키암호화

Global.asax의 Application_BeginRequest는 클라이언트의 리퀘스트가 발생하고 서버상의 처리가 시작되기 직전에 일어납니다.
즉 해당되는 페이지의 처리를 시작하기 전에 발생하는 이벤트이죠.
반대로 Application_PreSendRequestHeaders는 해당페이지의 서버처리가 끝나고 클라이언트에게 전송하기 직전에 발생합니다.

이걸 이용해서 웹어플리케이션에서 사용하는 모든 쿠키를 한방에 암호화, 복호화 하는 것이 가능합니다.
개발자는 암호화,복호화에 대하여 특별히 인식하지 않아도 안전하게 쿠키를 보존하는 방법을 제공할수 있죠.

Global.asax에 아래의 두 메서드를 추가합니다.

    protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
    {
        string[] keys = Response.Cookies.AllKeys;
       
        for (int i = 0; i < keys.Length; i++) //클라리언트로 전송해야할 쿠키를 루프
        {
            //ASP.NET_SessionId는 제외함. 이걸 바꿔버리면 새로운 세션으로 인식해버리기때문에..
            if (Response.Cookies[keys[i]].Name != "ASP.NET_SessionId") 
            {

                //이 샘플은 Cookie의 값이 하나일 경우만 복호화 처리를 하도록 했습니다.
                //약간 수정을 하면 계층구조의 쿠키값도 암호화처리를 할수 있습니다.
                if (Response.Cookies[keys[i]].Values.AllKeys.Length <= 1)
                {
                    //이 샘플에서는 방법을 제시할 뿐이므로 실제 암호화 처리를 생략하고
                    //::xx를 뒤에 추가하는걸로 암호화했다고 정의합니다.

                   
                    //여기에서 쿠키를 암호화 합니다.
                    HttpCookie cookie = Response.Cookies[keys[i]];
                    Response.Cookies.Remove(cookie.Name); //컬렉션키 재정의를 위해 기존쿠키를 컬렉션에서 삭제
                    cookie.Name = cookie.Name + "::xx";
                    cookie.Value = cookie.Value + "::xx";

                    Response.Cookies.Set(cookie); //쿠키를 재등록
                }
            }
        }
    }

 

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string[] keys = Request.Cookies.AllKeys;
       
        for (int i = 0; i < keys.Length; i++) //클라리언트부터 전송되어오는 쿠키를 루프
        {
            //ASP.NET_SessionId는 제외함. 이걸 바꿔버리면 새로운 세션으로 인식해버리기때문에..
            if (keys[i] != "ASP.NET_SessionId") 
            {

                //이 샘플은 Cookie의 값이 하나일 경우만 복호화 처리를 하도록 했습니다.
                //약간 수정을 하면 계층구조의 쿠키값도 복호화처리를 할수 있습니다.
                if (Request.Cookies[keys[i]].Values.AllKeys.Length <= 1)
                {
                    //이 샘플에서는 방법을 제시할 뿐이므로 실제 복호화 처리를 생략하고
                    //::xx를 지우는걸로 복호화했다고 정의합니다.

                    //여기에서 쿠키를 복호화 합니다.
                    HttpCookie cookie = Request.Cookies[keys[i]];
                    Request.Cookies.Remove(cookie.Name); //컬렉션키 재정의를 위해 기존쿠키를 컬렉션에서 삭제
                   
                    cookie.Name = cookie.Name.Replace("::xx", "");
                    cookie.Value = cookie.Value.Replace("::xx", "");
                   
                    Request.Cookies.Set(cookie); //쿠키를 재등록
                   
                }
            }
        }
    }




추가를 한후에 쿠키를 확인하기 위해 페이지를 하나 만들었습니다.
상단에는 현재 쿠키의 이름과 쿠키값을 리스트로 표시해주는 라벨이 있고 아래에는 쿠키값을 추가할수 있는 텍스트박스와 버튼을 배치했습니다.


TestCookie라는 이름의 Cookvalue값을 추가하고 페이지를 리로드 합니다.


그리고 다음 리퀘스트의 HTTP_COOKIE를 확인해보면 쿠키이름과 값이 암호화되서 클라이언트에 저장된것을 볼수 있습니다.



하지만 페이지상에서는 TestCookie인것을 알수가 있습니다.
실제로도 모든 작업을 Request.Cookie["TestCookie"]로 얻어 낼수가 있습니다.



이러한 조그마한 처리만으로도 커다란 세큐티리홀을 막아낼수 있습니다.
더군다나 요즘처럼 개인정보 유출등에 신경쓰이는때에 하나의 좋은 해결책이 될거 같습니다.
Trackback 0 Comment 0