XE 공식 자료실

애드온 JSecureXE ver. 0.2

제작자
AJKJ
등록일
2014-04-13
다운로드 수
888
링크1
www.google.com/recaptcha/mailhide/d?k=01IUxS_5_2GKCNkT3twpl3Vg==&c=uQ9rdLMJLWaEPmeFr9IF44Zfoa2u2vUsljWA8zGY5VU=

Javascript를 통한 보안 전송 애드온 입니다. 여러가지 사정으로 SSL을 설치하지 못하실 경우, 로그인 및 회원가입시의 각종 폼 정보(id, pw 등등)를 SSL에 준하게 암호화 하여 전송해 줍니다

라이선스
LGPL v2
설치경로
./addons/jsecure_xe
최초 등록일
2014-04-10
전체 다운로드
1,060
체험하기

쉬운설치로 바로 체험할 수 있습니다

상세 설명

본 애드온은 지원이 중단되었습니다.

개발을 하다 보니 Core를 수정하지 않고서는 암호화를 완벽하게 지원하기 힘들다는것을 알게되어서 더 이상 개발을 중단합니다.

보안이 필요하시다면 SSL을 설치하시는것을 권장합니다.

 

v 0.1과 대비하여 변동사항

직접 체험하여 확인하기

v0.2 데모 : http://first.wifi.olieh.com/demo/client2.php

v0.1 데모 :  http://first.wifi.olieh.com/demo/client.php

(실제로는input form이 생성되는게 보이지 않습니다. 이해를 돕기위한 것입니다.)

 

 

-- 버그수정

- 회원가입시 회원가입이 정상작동 하지 않은 경우가 있어서 수정

(이로 인하여 반드시 업데이트 하는것을 권장합니다.)

- xe 자체적으로 form validate에 logic 맞게 수정

 

 

-- 기능, 개선

- AES 암호화시 오버헤드 감소(여러개의 폼을 하나의 JSON으로 통합하여 전송)

- 암호화 하는과정을 더 이상 사용자에게 노출시키지 않음.

- 폼 전송후, 뒤로가기 버튼을 눌러도 데이터가 유지되게함.

(단 브라우저에 따라 폼을 수정할수는 없습니다.(Firefox, safari, 단 베타모드에서는 가능))

- 총 6개였던 javascript 를 1개로 통합하고 minify하여 제공, 트래픽 및 오버헤드 감소.

- beta 모드 추가

일반 상태에서는 폼을 전송시 암호화가 진행중임을 숨기고, 현 정보를 서버에 보내지 않게 하기위해 form을 disaable 시킵니다. 이렇게 할 경우 폼을 전송한 뒤에 뒤로가기를 누를경우 브라우저(FireFox Safari)에 따라서 form을 수정 할 수 없습니다. (아래 데모에서 확인이 가능합니다. 브라우저 별로 폼을 전송하신후 뒤로가기를 누른뒤에 다시 폼을 수정하려 해보세요.) 이것을 막기 위하여 beta mode를 만들었으며 베타모드에서는 새로운 form과 input을 동적으로 만들어서 사용합니다. 단 이 기능은 form 내에서 파일업로드가 없을 때에만 사용이 가능합니다.

beta mode를 ON 하면 form 내애 파일업로드(input.type != 'file')가 없을경우에는 자동으로 beta mode를 적용하고 파일 업로드가 있는 경우에는  일반모드를 자동으로 적용합니다.

beta 모드의 ON OFF는 애드온 환경설정에 있습니다.

사용하시다가 오류가 있으면 해당 기능을 끄실수 있습니다.

@Paul 님 감사합니다. 현재 베타모드에는 버그가 있어서 반드시 베타모드를 설정을 끄시고 사용하셔야 할것 같습니다. 베타모드는 추후에 개선하도록 하겠습니다.

 

-- 기타 v0.1 기존 설치자 유의사항

xe core를 수정하는 위치가 달라졌습니다. 기존과 비슷한 위치이나 함수명, 위치가 약간 달라졌습니다. 기존 애드온을 삭제하고, 새로 설치하는 마음으로 접근하시면 좋을것 같습니다. 

 

 

-- 작성자 이메일 변경

기존의 이메일 포워딩이 정상적으로 작동하지 않아 새로운 이메일로 변경

기존이메일 : JSecureXE@forward.olieh.com

변경 이메일 : nospam.forward.to.me+JSecureXE@gmail.com

 

 

-- 본문 --

JSecureXE SSL 반(half)대체 보안 전송 애드온입니니다.

 

- 간단 요약 -

Javascript + RSA + AES를 한 자바스크립트 보안전송 애드온 입니다.

여러가지 사정으로 SSL을 사용하지 못하는 분들을 위하여, ID, PW, 회원가입시 Javascript를 통한 암호화 전송으로 SSL에 준하는 보안효과를 제공합니다.

설치시에 XE코어를 약간 수정해야 애드온이 정상적으로 작동합니다.

무엇보다 데모를 보시는게 이해에 가장 좋을듯 합니다.
데모 사이트 http://first.wifi.olieh.com/demo/client2.php

v0.1 데모 :  http://first.wifi.olieh.com/demo/client.php

 

참고로 자바스크립트가 작동하지 않는 환경일경우 암호화 되지 않은채 그대로 전송이 됩니다. 자바스크립트 이용이 불가능하다고 하여, 로그인이 안된다거나 하는 문제는 없습니다.

(자바스크립트가 비활성화시 로그인이 안되게 하는것을 옵션으로 두는것도 생각을 해보았으나,

1.서버쪽에서는 사용자가 자바스크립트를 비 활성화 하는것을 첫 접속 페이지에서는 알 수 없습니다. (두번째 페이지에서는 간접적으로 알 수 있긴합니다단, 매우 정확하지 않습니다.(만약 폼이 암호화 되지 않을채로 왔을때 로그인을 거부한다해도, 이미 평문이 통신망을 타고 왔기에 의미없는 로그인 방어가 아닐까 싶습니다. 만약 자바스크립트 미지원 브라우저에서 로그인을 거부하고자 한다면, XE자체를 여러가지로 매우 깊숙히 개조해야 합니다.)

 

- 애드온 상세 개요 -

여러가지 사정으로 SSL을 사용하시기 힘든 경우에 사용하면 좋은 폼 보안전송 애드온 입니다.

회원가입, 로그인시에 id, pw등을 안전하게 암호화 하여 전송함으로서, 로그인 /회원가입 시에 SSL을 사용하는것에 준하는 보안 효과를 얻을 수 있습니다.

기본적으로 input form의 name 기준으로  'ser_id, password, password2, email_address, nick_name, user_name, find_account_question, find_account_answer, homepage, blog, birthday, birthday_ui, allow_mailing, allow_message 등이 암호화 됩니다. 필요에 따라, 암호화 할 form을 원하는 대로 설정 할 수 있습니다.

 

다만 클라이언트→서버로의 단방향 부분적(id, pw등 중요정보) 암호화 이고, 서버→클라이언트로의 암호화는 되지 않습니다.(이 부분은 해결하기 힘든 부분입니다.)

 

어디까지나 여러가지 사정(수시로 바꾸는 도메인, 웹호스팅사의 서브도메인 사용, 인트라넷, 개인용 사이트, 소규모 사이트 등등)으로 SSL을 사용하기 힘드신 경우에 사용하셨으면 좋겠습니다. 다만 한계상 세션 스니핑, 중간자 공격 등은 막을 수 없으며 서버→클라이언트로의 전송은 암호화가 되지 않습니다.

여건이 가능하시다면 SSL을 설치하는것을 추천드립니다.

 

- 기타 -

KISA에서는 개인정보가 암호화 되지 않은채로 전송이 되지 않도록 해야 한다고 말을 하고 있습니다. 또한 해당 사항을 위반할 경우 귀여운 벌금이 있다고 합니다. 이 애드온을 적절히 이용하신다면, 보안에서 가장 커다란 문제가 되는 로그인, 회원가입 시의 보안을 충분히 보완 할 수 있을 것이라 생각합니다.

https://guide.kisa.or.kr/guide/law.jsp#titView7

 

- 간단한 데모(원리) -

http://first.wifi.olieh.com/demo/client2.php

 

- 알고리즘 및 강도 -

RSA 1024 bit, AES 256 bit hybrid

 

- 사용환경 -

PHP 5.3.x 이상 ( openssl_decrypt 함수 사용)

(단 직접 애드온 개조시 그 이하에서 사용 가능)

(개조 tip:  aes관련 js와 php library를 movable type 에서 제공하는 AES library로 교체하세요 교체시 약 20배 정도 느려진다고 하는데, 전혀 체감못하겠더군요. 혹은 잘 아시는분은 mcrypt나 phpseclib을 사용하시면 좋을듯 합니다.)

http://www.movable-type.co.uk/scripts/aes.html )

XE 1.7.3.8 기준으로 정상 회원가입, 로그인 정상 가능하며, Wireshark로 packet 암호화가 확인되었습니다.

 

 

- 설치 방법 -

단순 addon 설치 외에도 XE core의 총 3개의 파일xe.js, xe.min.js xml_js_filter.js 파일을 수정 해야 정상적으로 작동하며, 수정하지 않으시면 애드온이 전혀 작동하지 않습니다.

XE core를 수정하실때는 반드시 해당 3개의 파일을 백업해 두시고 시작하세요.

 

일단 첫번째로

./common/js/xe.js         784 Line

./common/js/xml_js_filter.js    79 Line

두 파일 모두 다 딱 한줄의 코드를 추가하셔야 이용이 가능합니다.

encrypt_form(this) 를 아래와 같이 추가해 주시면 됩니다.

Ctrl+F를 누르시고 .submit(function(e) 로 검색하시면 빠르게 위치를 찾의 실 수 있을 것입니다.

몇 번째 Line이다는 참고만 하시고 Ctrl+F를 통해 .submit(function(e) 를 검색하시는게 좋을듯 합니다.

두 파일 모두 아래와 똑같이 나옵니다.

 

 

jsecure_xe_v2.png

 

첫번째 작업에서 2개의 파일을 수정 한 뒤에 두번째로 뒤에 .common/js/xe.js 파일의 모든내용을 복사하여 xe.min.js 파일에 덮어씌우세요.

js compression 를 할줄 아시는 분은 아래와 같은 사이트를 이용하여 js compress를 하신 뒤에 xe.min.js에 복사해 넣으시면 됩니다. js compression 은 트래픽 절약과 관련이 있는부분이고 하나 안하나 트래픽에 큰 영향이 없으니 초보분들은 안해서 이것을 안해서 어떠한 문제 생기나 걱정하실 필요는 없습니다.

JS Compression : http://refresh-sf.com/yui

 

참고로 초보분들을 위해 말하자면 xe.min.js 파일과 xe.js 파일의 내용은 본질적으로 동일합니다. 덮어씌어도 전혀 상관없습니다.

참고자료

http://www.xpressengine.com/devForum/22549443

http://www.xpressengine.com/userForum/22528779

 

--- 내용추가 ---

@새벽들녁 님 버그제보 감사합니다.

위의 내용을 그대로 하시면 일부 관리자페이지 이용이 불가능한 버그(위젯페이지에서 위젯 수정이 불가능함)가 있습니다.

 

JSecureXE_encrypt_form(this, e); 대신에 3줄 코드로 치환하시면 정상적으로 작동합니다.

 

if( typeof(JSecureXE_encrypt_form) != "undefined"){

        JSecureXE_encrypt_form(this, e);

 

}

 

 

 

마지막으로 RSA key 생성을 해야 하긴하나, addon을 설치하시면 첨부한 RSA key 생성기의 사용법을 알 수 있게 써 두었습니다. (RSA key 생성기도 첨부하였습니다. Key를 생성하신뒤에는 Key 생성기를 삭제하거나 비활성화 시켜두는것을 강력히 권장합니다.)

 

RSA key 생성기 예시 : http://first.wifi.olieh.com/demo/RSA.key.generator.php

 

 

 

- 상세 설명 및 원리 -

1. 서버쪽에서 Javascript 변수로 RSA public key 및 암호화를 진행할 input name array를 쏴줍니다.

(RSA key는 성능을 위하여 웹사이트 전체에 걸쳐서 addon 설치시 개발자가 딱 한번 만들어 두고 동일한 key를 계속 사용하며, 그렇게 하여도 충분히 안전합니다.)

 

2. 클라이언트에서 폼을 submit 할때 자바스크립트로 해당폼을 가로챕니다.

 

2-1) 100글자의 랜덤한 TEXT를 만들고(이하 AES_KEY라고 합니다.) 그 AES_KEY를 javascript로 

RSA Public_key로 암호화 합니다.

2-2) form에다 dynamic 하게 hidden input을 생성하고 해당칸에 RSA로 암호화한 AES_KEY를 넣습니다.

2-3) 사전에 지정된 input 내용(주로 id, pw, 이메일 등등)을 AES로 암호화 합니다.

2-4) 이제 클라이언트에서 전송합니다.

 

3. 서버에서 받은후 해독합니다.

3-1) 서버에서 모듈이 생성되기전에 애드온을 실행합니다.

3-2) 서버에서 RSA로 암호화된 AES_KEY를 받은뒤에 서버에 저장된 RSA Private_key로 풀어줍니다.

3-3) 해독한 AES_KEY로 나머지 폼들($_POST, $_GET)들을 전부다 풀어줍니다.

3-4) 해독한 폼 내용을 다시 덮어씌워 줍니다.

 

 

 

 

-- 다음 업데이트 예정 --

다음 업데이트는 1~2달 뒤에 될 것 같습니다. 제가 요즘 조금 바쁘네요. :)

- AJAX  암호화

(조금 복잡한 작업이 될듯 합니다. Ajax + 쌍방향 을 암호화 하기 위해서는 하기 위해서는 비교적 대규모의 개선작업이 필요합니다. ) 

 

- 관리자의 암호화 여부 체크 가능하도록 기능 추가

@김 기 상 감사합니다.^^ (Ver 0.1과는 달리, 현재로서는 최송 사용자의 편의를 위하여 모든 암호화 작업을 최대한 티가 나지 않게 하고있습니다. 그래서 암호화가 정상적으로 진행되는지 확인하려면, Wireshark등을 통하여 직접 패킷을 분석해 보는 방법밖에 없습니다. 다음 버젼에서는 관리자가 애드온을 적용후, 정상적으로 암호화 작업이 진행되는지 체크 할 수 있는 기능을 만들어 두겠습니다.)

 

-  Javascript 변수를 파일로 export 및 브라우저에서 js 파일로 로딩.

현재는 브라우저 상단에 javascript 변수를 직접 쏴주고 있습니다. 이에 따라서 아주 미세한 양이긴 불필요한 트래픽이 낭비되고 있습니다.(페이지당 약 0.5kb 정도 낭비가 진행됩니다.)  차후에는 불필요한 트래픽 절약을 위하여 javascript 변수를 본문과 분리하고 별도의 파일로 제공하고자 합니다.

 

- RSA 의 더 다양한 key size 지원(보안 강화)

더 뛰어난 보안을 지원하기 위하여 RSA 1024bit가 아닌 RSA 2048bit 3072bit 4086bit을 지원하고자 생각하고 있습니다. 참고로 현재도 RSA 1024bit 자체는 충분히 안전합니다. 구글링 하면 취약하다고는 하나, 그 취약한 정도가 누군가 간편히 풀 수 있는 정도는 아닙니다.(수많은 비용을 들여서 풀 수 있는 정도? 단 이정도로 중요한 정보를 다루는 사이트라면 SSL 사용을 강력히 권장합니다.)

 

- 더 빠르게 개선

서버와 key를 한번 교환한 뒤에는 추가적으로 RSA암호화를 진행하지 않게금 하여 더 빠르게 작동하도록 하고자 생각하고 있습니다.

 

- php 5.3 이하 지원

현재의 방법이 아닌 다른 방법을 이용하여 php5.3 이하에서도 본 addon의 이용이 가능하도록 개선하고자 생각하고 있습니다.

 

 

사용한 Library

 

gibberish-aes : 클라이언트에서 AES encrypt

http://github.com/mdp/gibberish-aes

라이센스 : MIT

 

php.net usre contribution sqAES class

http://www.php.net/manual/en/function.openssl-decrypt.php

라이센스 : PHP

 

phpseclib : RSA 서버단에서 key생성 및 decrypt

http://phpseclib.sourceforge.net/

License : MIT

 

php reCaptcha

https://developers.google.com/recaptcha/docs/php

License : 자체라이센스(MIT + 반드시 라이센스 첨부 필수)

 

RSA and ECC in JavaScript

http://www-cs-students.stanford.edu/~tjw/jsbn/

License : BSD

 

데모파일 및 애드온 라이센스 : LGPLv2

 

문의처 : nospam.forward.to.me+JSecureXE@gmail.com

(이메일 포워딩입니다. 본래 이메일은 스팸 방지를 위하여 안전한곳? 에 보관중입니다.)

포럼 2

로그인 후 작성할 수 있습니다.
  • 2014-08-29 23:28:46 큰돌♡

    최신 버전 XE에서는 제대로 동작이 안 되네요.

    RSA 생성 php는 마지막 부분을 아래처럼 수정해야할 듯 합니다.

    $RSA_object = new Crypt_RSA();
    $RSA_object->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
    $RSA_object->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);

    define('CRYPT_RSA_EXPONENT', 65537);
    extract( $RSA_object->createKey(1024)); // == $rsa->createKey(1024) where 1024 is the key size
    $publickey = str_replace(array("\r", "\n"), '', $publickey);
    $privatekey = str_replace(array("\r", "\n"), '', $privatekey);
    echo ('<meta charset="utf-8">');
    echo ('해당 칸을 그대로 복사하여 애드온에 집어넣으세요.');
    echo ('<br><br>');

    echo ("RSA Public KEY");
    echo ('<textarea readonly rows=10 cols=100>');
    echo ($publickey);
    echo ('</textarea>');

    echo ('<br><br>');
    echo ("RSA Private KEY");
    echo ('<textarea readonly rows=10 cols=100>');
    echo ($privatekey);
    echo ('</textarea>');
    }
    ?>

  • 2014-08-24 12:14:25 사랑해요XE

    업데이트를 손꼽아 기다리고 있습니다 ㅠㅠ