OpenSSL for Http-보안서버기능을 하는 암호화 프로그램 > 그누보드5 플러그인

그누보드5 플러그인

그누보드는 다양한 기능을 추가하기 쉽습니다.

OpenSSL for Http-보안서버기능을 하는 암호화 프로그램 정보

OpenSSL for Http-보안서버기능을 하는 암호화 프로그램

첨부파일

http_openssl.zip (86.0K) 381회 다운로드 2013-03-29 19:23:59

본문

#### OpenSSL for Http는 G4S가 나온지 별로 안되었을 때 공개하였으나 지금 G4S는 베타버젼이 32까지 왔습니다. 따라서 아래 소스 수정 방법이 최신 버젼과는 맞지 않을 수 있습니다. ####

약속한 대로 http_openssl을 공개합니다. 최근 출시된 그누보드 G4S용입니다.

잘 읽고 따라서 하셔야 합니다.

프로그램이 맘에 들면 기부를 생각해보세요. 기부 구좌는 DONATION.txt에 있습니다.

 
                              ========================================================
                              http_openssl(OpenSSL for Http based on PHP & JavaScript)
                              ========================================================


일반적으로 서버와 클라이언트 간 정보교환은 쉽게 탈취될 수 있습니다.
이런 까닭에 개인정보와 관련된 부분에서 보안 서버를 사용해야 할 필요를 발견하게 됩니다.
문제는 보안 서버를 유지하는 비용이 지속적으로 들어간다는데 있습니다.
개인 홈페이지의 경우 호스팅 비용외 추가적으로 들어가는 비용 역시 적지 않은 금액으로 여겨집니다.

저렴한 보안 서버의 경우 OpenSSL을 이용합니다. 아파치 서버의 경우 대부분 그렇습니다.
보안 서버로 연결하게 되면 일반적인 http로 접속이 되는 것이 아니라 https로 접속이 되어 보안서버임을 알립니다.

그렇다면 OpenSSL을 보안 서버가 아닌 일반 서버에서 구동되게 하면 어떨까? 하는 생각을 하게 됩니다.
이미 PHP로 작성된 웹 애플리케이션이 존재하기 때문에 그런 생각을 더 갖게 합니다. 예로 PHPSeculib이 그 중 하나입니다.

문제는 보안 서버를 사용하지 않고 클라이언트와 서버간 정보를 암호화하여 주고 받으려면
적어도 Javascript와 PHP로 구동 가능해야 합니다.
그런데 현재 인터넷에서 찾을 수 있는 모든 자료들은 PHP와 Javascript를 동시에 구동하는 프로그램이 많지 않으며
또한 그 효용도도 떨어진다는 것을 발견하게 됩니다. 그런 이유로 본 프로젝트를 시작하게 되었습니다.

OpenSSL for HTTP은 클라이언트에서는 Javascript로 서버에서는 PHP로 구동되는 프로그램으로
보안 서버와 거의 비슷한 기능을 합니다.

OpenSSL for HTTP은 다음과 같은 원리로 작동합니다. 이것은 한 예입니다:

1. 클라이언트에서 서버로 보안 페이지 접근
2. 서버에서 보안 페이지를 전송하면서 RSA 비대칭키인 public key를 제공한다.
3. 클라이언트 브라우저에서 서버와 상호간 사용할 AES(CBC모드) 대칭키를 생성한 후,
  이 키를 제공받은 RSA public key로 암호화한다.
4. 클라이언트에서 전송 전 모든 데이터를 생성된 AES(CBC모드) 대칭키로 암호화 한 후,
  3.번에서 RSA public key로 암호화한 값과 같이 전송한다.
  대칭키는 클라이언트에는 로그아웃할 때까지 쿠키로 저장한다.(이 대칭키 값은 보안 페이지 접속시 변할 수 있다.)
5. 서버에서 전송받은 데이터 중 RSA public key로 암호화된 대칭키를 RSA private key로 복호화 한 후,
  복호화한 대칭키를 이용해 나머지 데이터를 복호화하여 저장한다. 복호화한 대칭키는 필요한 경우 아니면 세션 저장하지 않는다.


OpenSSL for HTTP이 여러분에게 많은 유익이 되었다면 기부(donation)를 하는 건 어떤가요?
그렇다면 업그레이드 및 새로운 프로그램 개발에 도움이 될 겁니다.
기부(donation)를 하려면 DONATION.txt를 보면 구좌가 있습니다. 액수는 따지지 않습니다.


                                          =====================
                                          OpenSSL for HTTP 설치
                                          =====================

파일을 수정할 때 먼저 코드를 찾아 그 코드의 앞이나 뒤에 붙여넣거나 찾은 코드를 교체해야 한다.
따라서 설치방법을 읽을 때 찾은 코드의 "앞" 혹은 "뒤"인지를 확인하며, 또 "교체"인지 "추가"인지를 숙지한다.

1.파일복사
----------

첨부한 압축파일을 그누보드 g4s가 설치된 lib폴더에 폴더째 넣는다. 그렇게 해서 lib 안에 http_openssl이란 폴더가 있고
그 안에 파일들이 있는 구조가 되어야 한다.


2. common.php 를 연다.
----------------------

약 202 라인에서 다음 코드를 찾는다.

// QUERY_STRING
$qstr = '';


찾은 코드 "앞"에 다음의 코드를 "추가"한다.


//==============================================================================
// http_openssl
//------------------------------------------------------------------------------
include_once G4_LIB_PATH.'/http_openssl/http_openssl.lib.php';
// http_openssl 실행
http_openssl_load();
//==============================================================================



3. skin/member/basic/login.skin.php를 연다.
-------------------------------------------

다음의 코드를 찾는다.

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가


찾은 코드 "뒤"에 다음의 코드를 "추가"한다.


http_openssl_simple_prepare();



다음의 코드를 찾는다.

function flogin_submit(f)
{
    return true;
}


이 코드를 다음으로 "교체"한다.

function flogin_submit(f)
{

<?php http_openssl_js_form_submit('f'); ?>

}



4. skin/member/basic/member_confirm.skin.php를 연다.
----------------------------------------------------

다음의 코드를 찾는다.

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가


찾은 코드 "뒤"에 다음의 코드를 "추가"한다.


http_openssl_simple_prepare(true);



다음의 코드를 찾는다.

    f.action = "<?=$url?>";
    return true;


이 코드를 다음으로 "교체"한다.

    f.action = "<?=$url?>";

<?php http_openssl_js_form_submit('f'); ?>




5. skin/member/basic/register_form.skin.php 를 연다.
----------------------------------------------------

다음의 코드를 찾는다.

<form name="fregisterform" id="fregisterform" action="<?=$register_action_url?>" onsubmit="return fregisterform_submit(this);" method="post" enctype="multipart/form-data" autocomplete="off">


찾은 코드 "앞"에 다음의 코드를 "추가"한다.


<?php

http_openssl_prepare('w', 'u', 
	array('mb_id', 'mb_nick', 'mb_name', 'mb_email', 'mb_birth',
		'mb_homepage', 'mb_tel', 'mb_hp', 'mb_zip1', 'mb_zip2', 'mb_addr1', 'mb_addr2'),
	'member',
	'fregisterform',
	"\t\t// g4s의 경우 old_email 과  mb_nick_default가 더 있음.
\t\tif (i == 'mb_email' && f.elements['old_email']) f.elements['old_email'].value = aes.decrypt(encrypt_data[i], aes_key);
\t\telse if (i == 'mb_nick' && f.elements['mb_nick_default']) f.elements['mb_nick_default'].value = aes.decrypt(encrypt_data[i], aes_key);"
);
?>



다음의 코드를 찾는다.

    <? echo chk_captcha_js(); ?>

    return true;


이 코드를 다음으로 "교체"한다.

    <? echo chk_captcha_js(); ?>

<?php http_openssl_js_form_submit('f'); ?>



6. skin/member/basic/register_form_update.tail.skin.php를 연다.
---------------------------------------------------------------

다음의 코드를 찾는다.

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가


찾은 코드 "뒤"에 다음의 코드를 "추가"한다.


http_openssl_save_session();



7. skin/outlogin/basic/outlogin.skin.1.php 를 연다.
---------------------------------------------------

다음의 코드를 찾는다.

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가


찾은 코드 "뒤"에 다음의 코드를 "추가"한다.


http_openssl_simple_prepare();



다음의 코드를 찾는다.

function fhead_submit(f)
{
    return true;
}


이 코드를 다음으로 "교체"한다.

function fhead_submit(f)
{

<?php http_openssl_js_form_submit('f'); ?>

}


8. adm/admin.menu100.php를 연다.
--------------------------------

다음의 코드를 찾는다.

    array('',       '관리권한설정',     G4_ADMIN_URL.'/auth_list.php',     'cf_auth'),


찾은 코드 "뒤"에 다음의 코드를 "추가"한다.

	array('',       'OpenSSL for HTTP설정', G4_ADMIN_URL.'/http_openssl_form.php', 'cf_http_openssl'),


첨부된 압축파일을 푼 폴더에 보면 adm이란 폴더 안에 있는 두 개의 파일(http_openssl_form.php 와 http_openssl_form_update.php)를
adm 폴더로 "이동"한다.


9. adm/member_list.php를 연다.
------------------------------

다음의 코드를 찾는다.

<form id="fsearch" name="fsearch" method="get">


찾은 코드 "앞"에 다음의 코드를 "추가"한다.

<?php
http_openssl_simple_prepare(true,
"var encrypted_aes_key = rsa.encrypt(BASE64.encode(aes_key));

// GET방식으로 encrypted_aes_key를 전송한다.
$(document).ready(function(){
    $('a[href*=\"/member_form.php\"]').each(function () {
        var href = $(this).attr('href');
		if(href.match(/(\&|\?)w=u/gi) && !href.match(/(\&|\?)encrypted_aes_key=/gi)) $(this).attr('href', href+'&encrypted_aes_key='+encrypted_aes_key);
     });
});");
?>



10. adm/member_form.php를 연다.
------------------------------

다음의 코드를 찾는다.

<form name="fmember" id="fmember" action="./member_form_update.php" onsubmit="return fmember_submit(this);" method="post" enctype="multipart/form-data">


찾은 코드 "앞"에 다음의 코드를 "추가"한다.


<?php

http_openssl_prepare(
	'w', 'u', 
    array('mb_id', 'mb_nick', 'mb_name', 'mb_email', 'mb_birth', 'mb_homepage', 'mb_tel', 'mb_hp', 'mb_zip1', 'mb_zip2', 'mb_addr1', 'mb_addr2', 'mb_memo', 'mb_profile'),
	'mb',
	'fmember',
	""
);
?>



다음의 코드를 찾는다.

function fmember_submit(f)
{
    if (!f.mb_icon.value.match(/\.(gif|jp['e']g|png)$/i) && f.mb_icon.value) {
        alert('아이콘이 이미지 파일이 아닙니다. (bmp 제외)');
        return false;
    }

    return true;
}


찾은 코드를 다음으로 "교체"한다.


function fmember_submit(f)
{
    if (!f.mb_icon.value.match(/\.(gif|jp['e']g|png)$/i) && f.mb_icon.value) {
        alert('아이콘이 이미지 파일이 아닙니다. (bmp 제외)');
        return false;
    }

<?php http_openssl_js_form_submit('f'); ?>

}





11. adm/member_form_update.php를 연다.
--------------------------------------

다음의 코드를 찾는다.

goto_url('./member_form.php?'.$qstr.'&amp;w=u&amp;mb_id='.$mb_id, false);


찾은 코드 "앞"에 다음을 "추가"한다.


http_openssl_save_session();





12. adm/admin.head.php 를 연다.

다음의 코드를 찾는다.

<header id="hd">


찾은 코드 "앞"에 다음을 "추가"한다.

<?php
http_openssl_simple_prepare(true,
"var encrypted_aes_key = rsa.encrypt(BASE64.encode(aes_key));

// GET방식으로 encrypted_aes_key를 전송한다.
$(document).ready(function(){
    $('a[href*=\"/member_form.php\"]').each(function () {
        var href = $(this).attr('href');
		if(href.match(/(\&|\?)w=u/gi)) $(this).attr('href', href+'&encrypted_aes_key='+encrypted_aes_key);
     });
});");
?>



13. http_openssl을 사용하기 위해서는 RSA 키를 생성해야 한다.
------------------------------------------------------------

따라서 완료가 되면 adm/http_openssl_form.php로 이동하여 세팅을 해야 한다.

관리자 로그인 후 관리자 페이지에서 "환경설정->OpenSSL for HTTP설정"으로 가서
OpenSSL for HTTP 사용에 체크하고 아래 RSA 키 생성에 체크를 한 후 관리자 비번 넣고 "확인"을 누르면
잠시 화면이 멈추어 있을 겁니다. 다운된 것이 아니라 RSA 키생성 시간이 오래 걸리니 기다리고 있으면 됩니다. 만일 서버에서 bcmath를 사용하지 않는다면 대략 난감...

그럴 때는 압축푼 파일 안에 rsa_keygen.html이란 파일이 있습니다. 이걸 실행하고 약간 기다리면
PEM public키와 private키가 나옵니다. 이 키값을 config 테이블에 넣어야 합니다.
cf_http_openssl_use 필드가 없으면 생성해서 값은 '1'을 주고
cf_pem_privatekey에 생성된 private 키값을, cf_pem_publickey 필드에는 public 값을 주면 됩니다.

대부분의 서버는 bcmath를 지원하기 때문에 브라우져가 다운되는 경우는 그렇게 많지 않을 겁니다.



많은 분들이 OpenSSL for HTTP를 적용하고도 SSL보안서버 구축을 한 가운데서 사용을 해야 하는지에 대해 궁금해 하는 것같습니다. OpenSSL for HTTP를 설치하였다면 SSL 보안서버 구축을 하지 않아도 됩니다. 다음은 관련 규정입니다. 규정에서 "보안서버는 다음 각 호 중 하나의 기능을 갖추어야 한다"가 있습니다. OpenSSL for HTTP는 이 중 두 번째에 해당합니다.


개인정보의 기술적/관리적 보호조치 기준 
(방송통신위원회고시 제2009-21호)	

제2조(정의) 이 기준에서 사용하는 용어의 뜻은 다음과 같다. 
9. “보안서버”라 함은 정보통신망에서 송?수신하는 정보를 암호화하여 전송하는 웹 서버를 말한다. 

제6조(개인정보의 암호화) 
③ 정보통신서비스 제공자 등은 정보통신망을 통해 이용자의 개인정보 및 인증정보를 송/수신할 때에는 안전한 보안서버 구축 등의 조치를 통해 이를 암호화해야 한다. 보안서버는 다음 각 호 중 하나의 기능을 갖추어야 한다. 
1. 웹 서버에 SSL(Secure Socket Layer) 인증서를 설치하여 전송하는 정보를 암호화하여 송/수신하는 기능 
2. 웹 서버에 암호화 응용프로그램을 설치하여 전송하는 정보를 암호화하여 송/수신하는 기능 
추천
11

댓글 전체

아 한가지! 관리자 페이지 상단의 '관리자 정보수정' 링크가 제대로 동작하지 않습니다.

adm/member_list.php 에서 '수정' 하는 것은 정상 동작하지만요..

member_list.php 파일에 있는 http_openssl_simple_prepare() 가 adm/admin.head.php 파일에 있어야 할것 같습니다.

member_list.php 에서는 지우고 admin.head.php <div id='to_content'> 위에

<?php
// member_form.php 에서는 사용하지 않음
if(basename($_SERVER['SCRIPT_NAME']) != 'member_form.php') {
	http_openssl_simple_prepare(true,
	"var encrypted_aes_key = rsa.encrypt(BASE64.encode(aes_key));

	// GET방식으로 encrypted_aes_key를 전송한다.
	$(document).ready(function(){
		$('a[href*="/member_form.php"]').each(function () {
			var href = $(this).attr('href');
			if(href.match(/[\&\?]w=u/gi)) $(this).attr('href', href+'&encrypted_aes_key='+encrypted_aes_key);
		 });
	});");
}
?>


if(href.match.. 정규표현식을 /&w=u/gi 에서 /[\&\?]w=u/gi 로 변경했습니다. 상단의 링크는 ?w= 이렇게 시작해서..

일단 되는데 다른 문제가 또 있을지는 모르겠네요.
감사합니다. 정규표현식이 잘못됐네요. "?w=" 이렇게 시작하는 것을 생각못했네요. 그것 때문에 링크가 작동하지 않은 것 같네요.
넵 ^^ 댓글에 쓴것처럼.. 정규식만 고치면 안되고 http_openssl_simple_prepare() 함수 위치를 모든 관리자 페이지에서 사용하는 admin.head.php 로 옮겨야.. 관리자 페이지 상단에 위치한 '관리자 정보 수정' 링크가 제대로 동작합니다 ^^
저는 이상없이 잘 됩니다. 또한 이게 안되면 다른 페이지에서도 안되야 합니다. 어쩌면 byfun님이 membr_list.php에서 "수정"링크를 클릭하는 것이 아니라 바로 member_form.php로 이동하기 때문이 아닐까 싶습니다.

또한 이걸 모든 관리자 페이지까지 갈 필요가 없습니다. 즉, http_openssl_simple_prepare()함수를 admin.head.php로 옮길 이유가 없습니다. 요점은 개인정보만 암호화하면 되니까 특정 페이지에 적용하는 겁니다. 그리고 adm/member_list.php에서 "member_form.php"를 거쳐가도록 했기 때문에 그런 겁니다.

즉, member_list.php를 거치지 않고 member_form.php로 넘어가는 것을 생각해 볼 수 있지만 이건 정상적인 경우가 아니라고 판단하기 때문에 member_list.php 파일에서 member_form.php 에 대한 링크를 찾는 겁니다.

그나저나 남의 소스 인데도 읽어내는 능력이 탁월하십니다.
letsgolee 님이 말씀하신것처럼 member_list.php 를 거치지지 않고 바로 member_form.php 로 갈 경우가 문제인데.. 이런 링크가 g4s 기본 관리자 페이지에 있기 때문에 수정해본것입니다.

관리자 페이지 제일 상단에 보면 '관리자 정보 수정' 이라는 링크가 있습니다.
요것이 약간 예외적인 상황인것이지요. 관리자 페이지 아무데서나 member_form.php 파일로 이동하기 때문이죠.

* 칭찬 감사합니다 ^^
감사합니다. 적용해보니 잘 되는군요^^
그런데, 예약게시판 등에서 개인정보를 받게되면 암호화를 해야 할 것 같은데요.
게시판에 적용하는 방법은 어떻게 되나요?
게시판에서 적용하는 경우는 write.skin.php 및 view.skin.php에서 해야겠죠. 먼저 view.skin.php에서는 서버에서 암호화된 데이터를  받아와야니까 list.skin.php에서 먼저 AES키를 전송해주어야 하고(GET방식으로) 그리고 암호화된 데이터를 view.skin.php에서 복호화해서 보여주면 되고 또 write.skin.php 역시 암호화 된 데이터를 받아와 복호화 할 뿐 아니라 암호화 전송이 필요합니다. 두 스킨 파일의 소스를 알면 적용하는 것은 어렵지 않습니다.
gpf - 플러그인 형태로 설치했는데, 회원정보 수정 페이지에서 값들이 암호화된 상태로 보여서 좀 난감한 상태인데 제가 어떤 부분을 잘못했는지 여기서 질문하는게 ...... 맞을런지도 모르겠네요. ㅎ.
아무튼 정말 감사합니다.
gpf플러그인 형태라면 먼저 gpf 부터 버젼 확인해봐야할지 모르겠습니다.

http://sir.co.kr/bbs/board.php?bo_table=g4s_plugin&wr_id=37 여기 코멘트보면 "2013년 3월 30일 이전에 설치하신분은 gpf4s 를 업데이트 하셔야 합니다"라고 되어있네요.
4월 8일에 처음 다운받아 설치한거라서 버전은 문제가 아닌 듯합니다.
그리고 G4용으로 공개해 주신 (http://sir.co.kr/bbs/board.php?bo_table=g4_plugin&wr_id=14476&page=1) 이 플러그인입니다.
GPF에 대한 도움은 제가 드리기 어려울 것 같습니다. GPF를 사용해보지 않았기 때문에 어떻게 작동하는지를 먼저 살펴봐야 하거든요.
그누G4S 원본코드가 바뀌어서 안내문을 수정해주시는게 좋을거 같아요. 폼전송하는 구조를 잘 알고 있는 유저라면 변경된 소스로도 적용하는게 무리가 없지만 곧이 곧대로 할 줄 밖에 모르는 사람은 이 플러그인을 받아도 적용하기 어려울 수 있어서요.
좋은 지적에 감사합니다. 하지만 g4s는 현재 개발중인 상태로 완료가 되지 않은 점이 현재의 소스를 수정하는 일을 주저하게 합니다. 소스가 수정될 때마다 수정할 수는 없을 것이므로 최종 정식버젼이 나올 때까지 기다리는 것이 좋을 듯합니다. 다만 지적하신대로 안내문에 이와 관련 내용을 언급하는 것은 필요할 것 같습니다.
헷갈릴수도 있는 분들을 위해 한말씀 적어 보자면, 이해가 안되도 자꾸 보다보면 이해 되듯이 수정되는 내용에는 공통점이 있습니다.

원본코드가 조금 바뀌더라도 변치 않는 것은

폼값 전송 전에 체크 하는 부분에서 체크할꺼 다 해주고

>> return true;
이부분이 반환해서 최종값을 전송하게 되는데
이부분을 아래 코드로 대체 하면 됩니다.

<?php http_openssl_js_form_submit('f'); ?>

리턴값 외에 다른 문구가 있다면 무시하면 됩니다. 그 부분을 건들지 말고
위 부분을 대체하여 넣어주기만 하면 됩니다.
게시판에 적용할때 예제 소스 같은것은 없나요? 초심자가 하기에는 어렵네요~ ^^;; 첨부파일에 적용시키고 싶은데 무슨 소리인지 알수가 없어서 ;;
g4 경우엔 adm/admin.head.php 파일에서 아래 소스를 어디에 추가하나요?
배추빌더 (g4) 이용 중인데, <header id="hd">가 없어 어디에 넣을지 모르겠네요.


<?php
http_openssl_simple_prepare(true,
"var encrypted_aes_key = rsa.encrypt(BASE64.encode(aes_key));

// GET방식으로 encrypted_aes_key를 전송한다.
$(document).ready(function(){
    $('a[href*=\"/member_form.php\"]').each(function () {
        var href = $(this).attr('href');
if(href.match(/(\&|\?)w=u/gi)) $(this).attr('href', href+'&encrypted_aes_key='+encrypted_aes_key);
    });
});");
?>
답변 지금 확인해주실지는 모르겠지만... 적용 후, 자동로그인 체크한 뒤 로그인 후 다시 로그인할때 ID입력란에 암호화된 아이디 값이 입력이 되어있습니다. 그럼 login.skin.php 에는 적용을 하지 말아야하는지.... 어디서 부터 수정을 해야할지 잘 모르겠습니다. 혹시 아시는 분이 계시다면 답변달아주시면 감사하겠습니다.
답변이 늦었습니다. 혹 각각의 로그인 스킨이 있다면 당연히 거기도 적용을 해주시면 됩니다. 위에서 skin/member/basic/login.skin.php 에 대한 설명이 있지요? 그것을 참조해서 하면 되요.
잘 되는지 안되는진 모르겠지만 일부 g4라 표시된걸 g5라고 바꾸고 적용하니 문제는 없이 싸이트가 잘 뜨네요. 감사합니다.
outlogin.skin.2.php 에도 적용하는 방법이 없을까요? 회원정보수정창 옆에 위치하고 있어서 정보수정 누르면 글자가 깨져서 나옵니다. 암호화 되서 나옵니다. 방법이 없을까요?
전체 503
그누보드5 플러그인 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT