CI 묻고 답하기

제목 CI ajax 암호화 관련 질문입니다.
글쓴이 나이유미 작성시각 2014/08/13 01:06:43
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 14473   RSS
질문 요지 CI의 config 아이템 중 encryption_key를 암호화 하여 숨기면서
클라이언트에서 서버로 전송하는 값을 암호화 하여 전송하는 알고리즘(?프로세스!?) 을 알고 싶습니다.
제가 구현한 방식은 아래와 같습니다.

1) javascript - 암호화 키 세팅
전역 변수에 CI가 제공 하는 암호화 키를 넣어줍니다.
encryption_key가 암호화 되어 출력 되어 소스보기로 볼시 암호화 되어 나옵니다.
var encKey = '{C}encrypt->encode( $this->config->item("encryption_key", FALSE, TRUE))?>';
var encKey = 'o3biI+A1BKc+4gwLvDDSXfWp+HA7uspTyrsq8qDM6RjsCz0TE2EDZk95wRjzjoNndtAwuZwArixBnMM4EhBMdA=='; 


2) javascript - 포스트 발송 GibberishAes 라이브러리 사용하여 전송 하려는 값을 암호화
ajax post시 encKey를 동시에 발송 해줍니다.
즉 전송하려는 값 foo와 encKey를 동시에 발송 해줍니다. csrf_test_name은 애교-_-;
​var bar = GibberishAES.enc(oForm.find('input[name=uq_member_id]').val(), encKey);
            var posting = $.post( url, { csrf_test_name: csrf_test_name, encKey : encKey, foo : bar } );

3) php(CI) - 포스트 받음 ajax
받은 encKey를 decode하여 gibberishaes에 키로 넣어줍니다.
    public function testProcess(){
        $req = $this->input->post();
        $encKey = $req['encKey'];
        $dEncKey = $this->encrypt->decode($encKey);
        $foo = $this->input->post('foo');
        $dFoo = $this->gibberishaes->dec($foo, $encKey);

        echo sprintf('<|>encKey>>%s<<',  $encKey);
        echo sprintf('<|>dEncKey>>%s<<', $dEncKey);
        echo sprintf('<|>foo>>%s<<',     $foo);
        echo sprintf('<|>dFoo>>%s<<',    $dFoo);
    }

4) 출력 결과
4-1)포스트로 받은 encKey값
<|>encKey>>IoAZi2jDKAy+IhEmNosef6DOcD2Pwq79iEtNMbjecgpwMdQFx6d0vL+UWGRC8mh1ap2XxBXRZilG5QBcDnnkMg==<<

4-2) php에서 CI가 제공하는 함수로 디코딩 된 값.질문 요지 CI의 config 아이템 중 encryption_key를 암호화 하여 숨기면서
클라이언트에서 서버로 전송하는 값을 암호화 하여 전송하는 알고리즘(?프로세스!?) 을 알고 싶습니다.
제가 구현한 방식은 아래와 같습니다.

1) javascript - 암호화 키 세팅
전역 변수에 CI가 제공 하는 암호화 키를 넣어줍니다.
encryption_key가 암호화 되어 출력 되어 소스보기로 볼시 암호화 되어 나옵니다.
var encKey = '{C}encrypt->encode( $this->config->item("encryption_key", FALSE, TRUE))?>';
var encKey = 'o3biI+A1BKc+4gwLvDDSXfWp+HA7uspTyrsq8qDM6RjsCz0TE2EDZk95wRjzjoNndtAwuZwArixBnMM4EhBMdA=='; 


2) javascript - 포스트 발송 GibberishAes 라이브러리 사용하여 전송 하려는 값을 암호화
ajax post시 encKey를 동시에 발송 해줍니다.
즉 전송하려는 값 foo와 encKey를 동시에 발송 해줍니다. csrf_test_name은 애교-_-;
​var bar = GibberishAES.enc(oForm.find('input[name=uq_member_id]').val(), encKey);
            var posting = $.post( url, { csrf_test_name: csrf_test_name, encKey : encKey, foo : bar } );

3) php(CI) - 포스트 받음 ajax
받은 encKey를 decode하여 gibberishaes에 키로 넣어줍니다.
    public function testProcess(){
        $req = $this->input->post();
        $encKey = $req['encKey'];
        $dEncKey = $this->encrypt->decode($encKey);
        $foo = $this->input->post('foo');
        $dFoo = $this->gibberishaes->dec($foo, $encKey);

        echo sprintf('<|>encKey>>%s<<',  $encKey);
        echo sprintf('<|>dEncKey>>%s<<', $dEncKey);
        echo sprintf('<|>foo>>%s<<',     $foo);
        echo sprintf('<|>dFoo>>%s<<',    $dFoo);
    }

4) 출력 결과
4-1)포스트로 받은 encKey값
<|>encKey>>IoAZi2jDKAy+IhEmNosef6DOcD2Pwq79iEtNMbjecgpwMdQFx6d0vL+UWGRC8mh1ap2XxBXRZilG5QBcDnnkMg==<<

4-2) php에서 CI가 제공하는 함수로 디코딩 된 값.
<|>dEncKey>>naiyumie_sexy_encryption_key<<
CI의 encryption_key와 일치 합니다.
4-3) 전송받은 암호화 된 foo 값
<|>foo>>U2FsdGVkX1+tbTLtzuorDn+CRuaP6Gfcj2Hulbilr0hKkXczHrSZqwTbpTyAfyRJ<<

4-4) 암호화가 해재된 foo의 값
<|>dFoo>>xxxxxxxxgggggggbggggg<<  

5) 화면
움직이려면 클릭 후 드래그 하세요

이런식으로 구현해 보았습니다만, 
어떻게 암호화가 되었든 암호화 키가 노출이 되어 있는데요
이런식으로 구현 하였는데 별다른 문제가 없을지 알고 싶습니다.

감사합니다.
<|>dEncKey>>naiyumie_sexy_encryption_key<<
CI의 encryption_key와 일치 합니다.
4-3) 전송받은 암호화 된 foo 값
<|>foo>>U2FsdGVkX1+tbTLtzuorDn+CRuaP6Gfcj2Hulbilr0hKkXczHrSZqwTbpTyAfyRJ<<

4-4) 암호화가 해재된 foo의 값
<|>dFoo>>xxxxxxxxgggggggbggggg<<  

5) 화면
움직이려면 클릭 후 드래그 하세요

이런식으로 구현해 보았습니다만, 
어떻게 암호화가 되었든 암호화 키가 노출이 되어 있는데요
이런식으로 구현 하였는데 별다른 문제가 없을지 알고 싶습니다.

감사합니다.






글이 잘안올라가서 첨부합니다.
첨부파일 질문_요지_CI의_config_아이템_중_encryption.docx (20.2 KB)
 다음글 패이지 네이션에 대해서 (1)
 이전글 소스코드 중첩 배열 줄 어떻게 맞추시나요? (1)

댓글

변종원(웅파) / 2014/08/13 07:27:29 / 추천 0
문제가 됩니다. 암호화키가 노출되어 post전송되는 것 자체가 문제입니다. 공개키 방식 검색해보세요. 서버에서 암호키와 공개키를 생성하고 공개키를 배포,  클라이언트쪽에서는 공개키를 가지고 암호화하여 내용 전송.
서버에서는 저장되어있는 암호키로 해독.
 
letsgolee / 2014/08/13 08:09:30 / 추천 0
위에서 변종원(웅파)님이 설명하셔서 덧붙이자면 서버의 암호화키는 세션을 암호화한다든지 사이트 전체적으로 사용하는 키입니다. 이 키는 절대 공개되어서는 안되는 키입니다.