포럼
JSecureXE SSL 반 대체 보안 전송 애드온을 만들었습니다.
2014.04.10 02:36
JSecureXE SSL 반(half) 대체 보안 전송 애드온을 만들었습니다.
Javascript + RSA + AES를 이용하였으며, hybrid 암호화를 이용하여 단순 RSA를 사용하는것보다 오버헤드가 적고 빠름니다.
이전글 : http://www.xpressengine.com/userForum/22675758
다운로드 페이지에 올리려고 했는데, 자료가 안올라가네요.;; 업로드도 안되고 글만 작성이 되네요.;;;
랩업 하기 전까지는 사용자 포럼에 글을 올려야 될것 같습니다.
- 애드온 개요 -
여러가지 사정으로 SSL을 사용하시기 힘든 분들을 위한 폼 보안전송 애드온 입니다.
회원가입, 로그인시에 id, pw등을 안전하게 암호화 하여 전송함으로서, 로그인 /회원가입 시에 SSL을 사용하는것에 준하는 보안 효과를 얻을 수 있습니다.
기본적으로 input form의 name 기준으로 user_id, password, password2(회원가입시 패스워드 재입력), email_address, nick_name(별명), user_name(이름), find_account_question, find_account_answer, homepage, blog, birthday, birthday_ui, allow_mailing 등이 암호화 됩니다. 필요에 따라, 암호화 할 form을 원하는 대로 설정 할 수 있습니다.
다만 클라이언트→서버로의 단방향 부분적(id, pw등 중요정보) 암호화 이고, 서버→클라이언트로의 암호화는 되지 않습니다.(이 부분은 나중에 시간이 나면 천~천히 만들어 볼 생각입니다.)
어디까지나 여러가지 사정(수시로 바꾸는 도메인, 웹호스팅사의 서브도메인 사용, 인트라넷, 개인용 사이트, 소규모 사이트 등등)으로 SSL을 사용하기 힘드신 경우에 사용하셨으면 좋겠습니다. 다만 한계상 세션 스니핑, 중간자 공격 등은 막을 수 없으며 서버→클라이언트로의 전송은 암호화가 되지 않습니다.
여건이 가능하시다면 SSL을 설치하는것을 추천드립니다.
- 기타 -
KISA에서는 개인정보가 암호화 되지 않은채로 전송이 되지 않도록 해야 한다고 말을 하고 있습니다. 또한 해당 사항을 위반할 경우 귀여운 벌금이 있다고 합니다. 이 애드온을 적절히 이용하신다면, 보안에서 가장 커다란 문제가 되는 로그인, 회원가입 시의 보안을 충분히 보완 할 수 있을 것이라 생각합니다.
https://guide.kisa.or.kr/guide/law.jsp#titView7
- 간단한 데모(원리) -
http://first.wifi.olieh.com/demo/client.php
- 알고리즘 및 강도 -
RSA 1024 bit, AES 256 bit hybrid
- 사용환경 -
PHP 5.3.x 이상 ( openssl_decrypt 함수 사용), 애드온 개조시 그 이하에서 사용 가능
(개조 tip: aes관련 js와 php library를 movable type 에서 제공하는 AES library로 교체하세요 교체시 약 20배 정도 느려진다고 하는데, 전혀 체감못하겠더군요.)
XE 1.7.3.8 기준으로 정상 회원가입, 로그인 정상 적으로 됩니다. 모바일도 가능합니다.
- 설치 방법 -
단순 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) 를 검색하시는게 좋을듯 합니다.
두 파일 모두 아래와 똑같이 나옵니다.
--------------------------------------
--------------------------------------
첫번째 작업에서 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
마지막으로 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. AES 128bit 로 연산량 낮추기
클라이언트의 암호화 속도를(특히 모바일 환경) 높이기 위하여 AES 256bit이아닌 AES 128bit을 쓰면 좋을것 같습니다. 다만 library에서 128bit가 정상작동하지 않아서 기본값인 256bit를 이용했습니다. 차후에 바뀌면 좋을것 같아요.
3. 서버→클라이언트 Javascript 암호화
서버에서 클라이언트로 오는 것에 대하여도 javascript로 암호화가 되면 좋겠다는 생각이 듭니다. 여러가지 문제로 조금 복잡할것 같습니다. 클라이언트의 decrypt 능력, 키 교환등에 대해서도 여러가지로 고려해 보아야 할것이 많을것 같습니다.
사용한 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
JSecureXE@forward.olieh.com
(이메일 포워딩입니다. 본래 이메일은 스팸 방지를 위하여 안전한곳? 에 보관중입니다.)
댓글 10
-
루팡쿠팡
2014.04.10 03:02
RSA key 생성기 예시에서 앞 뒤의 -- 를 포함하여 전부 복사해서 addon에 집어넣으라는것이 정확한 파일명과 몇번째 줄에 첨가 해야 하는지 알 수 있을까요? -
AJKJ
2014.04.10 03:15
네 맞아요. 앞뒤 ----- 로 둘러쌓인것을 포함하여 그대로 복사해서 붙여넣으시면 될거에요. 생성기예시를 그대로 복사해서 붙여넣으면 알아서 잘 들어갈거에요.
XE 최상위 폴더에서 common폴더 그리고 js 폴더에 들어가시면 xml_js_fileter.js와 xe.js가 있을것이에요.
두 파일 모두 다 .submit(function(e) 을 Ctrl+F로 검색하시고, 위 사진과 같이 encrypt_form(this); 라는 코드를 추가시켜 주시면 될거에요. 두 파일 모두 다 비슷하게 생겼어요.
xml_js_fileter.js 만 수정하면 PC버젼만 에서 xe.js만 수정하면 모바일에서만 폼이 암호화 되요. 둘다 수정해야 PC 모바일버젼 상관없이 폼이 암호화 되요
-
prologos
2014.04.10 04:59
디버그 모드가 아닌이상 xe.min.js를 로드하므로 xe.js를 수정해서는 적용이 안됩니다. xe.js수정 후 http://javascript-minifier.com/ 사이트나 직접 압축을 한 후 xe.min.js에 적용해야 할것으로 보입니다.
그리고 rng.js:43번째 줄에서 지속적으로 rng_psize is not defined 오류가 발생합니다 @.@
그냥 변수 정의만 해주면 되는지... 무언가 빠뜨리셨는지 문의 드립니다.
-
AJKJ
2014.04.10 05:10
저는 rng 에서 debug를 해보아도 256이라는 값이 저는 잘 정의되어 있다고 나오네요.
prng4.js가 잘 로딩되었는지 확인 한번 해보세요. 찾아보니 prng4.js 에 해당값이 정의되어 있습니다.
그리고 addon도 정상적으로 작동하고요. 일단은 뭔가 빠진게 있을지도 모르겠으니 addon을 확인후 재업로드 하였습니다.
그리고 모바일 부분은 말씀하신게 맞습니다. 제가 실수했네요. 다만 초보분들이 설치하기는 어려울것 같습니다. 일단 최대한 상세히 안내 해 보겠습니다
-
prologos
2014.04.10 05:33
애드온에서 prng4.js보다 rng.js를 먼저 로드하게 되어 있어서 발생한 오류 같네요. rng.js수정없이 js로드 순서를 바꿨더니 오류가 사라졌습니다.
-
AJKJ
2014.04.10 05:36
js 로딩 문제때문은 아니지 않을까 싶습니다. rsa.js 의 경우 jsbn.js 에 매우 크게 의존하는데도 불구하고, rsa.js가 더 먼저 로딩이 되어도 전혀 문제가 없었기 때문이지요. 그래도 혹시라도 설치하신 분들중에서 동일한 문제를 겪으셨다면 댓글을 남겨주시거나 이메일을 보내주시면 감사하겠습니다.
-
AJKJ
2014.04.10 05:32
초보분들을 위하여 설명을 추가하였습니다. 감사합니다. :)
-
사랑해요XE
2014.08.24 12:12
이 애드온 조금만 더 다듬어지면 멋진 애드온이 될텐데..
-
oscarmike
2014.08.24 12:16
이 에드온을 사용하면 SSL 등록을 하지 않아도 KISA 로 부터 아무런 문제제길르 받지 않는건가요?
그리고 키 생성하는 부분 이해가 잘 안되네요.
저는 호스팅 서비스 이용하고있는데 생성기를 어찌 사용해야하는지 잘 모르겠어요
-
AJKJ
2014.08.24 14:23
자료실에 올라와있는 Jseucre_Xe를 이용하시면 좋을것 같습니다.
그리고 현재로서는, ajax를 이용한 로그인, 회원가입시에는 암호화가 되지 않습니다.
ajax를 이용한 로그인, 회원가입이 없다면, KISA에서 제제를 받지 않을 수 있을것이라 생각합니다.