php php 암호화와 복호와

2010.05.17 18:21

Elkha 조회 수:7305

참고 문서  

key[1].jpg

XE 공식 자료실

XE 공식 자료실 모듈은 제목에 나와있듯이 자료실 운영에 매우 유리하다. 그런데 이 모듈은 다운로드 권한을 부여할 때, 모듈 단위로 지정한다. 즉 10가지 각기 다른 권한이 있으면 자료실도 10개가 있어야 한다는 뜻. 내가 원하는 자료실은 조금 다른 형태로서, 각 회원에게 부여된 고유 권한에 따라 파일 다운로드 권한이 발생하는 것이었다. 또한 코드의 간결성을 위해 스킨상에서만 링크를 제어하는 것이다.

보안

각 회원마다 다운로드 권한을 부여하기 위해 열심히 고민했다. 많은 시간이 소요된 것은 사실이지만, 덕분에 php 에 대해 어느정도 익숙해진 것 같다. 아무튼 내가 생각한 방법은 크게 3가지가 있다.

링크 숨기기

먼저 한 가지는 권한이 있는 유저에게만 링크를 제공하는 것이다. if 구문을 사용한 쉽고 간편한 방법이다. 하지만 한번 노출된 url은 제3자에게도 다운로드 권한이 부여된다. form 태그를 사용하면 좀 더 안전하지만, 기본적인 지식으로도 제3자에게 파일을 받을 수 있는데는 변함이 없다.

모듈 제작

가장 확실한 방법으로 db 정리나 XE 호환성에 매우 유리하다. 하지만 불필요한 모듈을 하나 늘리게 되는 단점이 있다. 내 목표는 스킨에서만 링크를 제어하는 것이기 때문에 추가 모듈은 무의미했다.

비밀번호와 암호화

내가 선택한 방법으로, 파일 정보를 비밀번호와 결합시켜 다운로드를 제공한다. form 태그의 정보가 모두 노출되어도 비밀번호를 모르면 파일을 받을 수 없다. 지금은 실력부족으로 독립된 php 파일에서 다운로드를 처리하는게 매우 아쉽다.

php 인코딩

php를 암호화하는 방법에는 다양한 방법이 있지만, 자료실을 제작할 때 두가지 조건은 반드시 충족해야 했다.

  1. 암호화된 정보는 제3자가 복호화할 수 없어야 한다.
  2. 암호화된 정보는 원래대로 살릴 수 있어야 한다.

이 조건을 만족하기 위해 많은 시간을 삽질했으며, 발견한 php 함수들은 모두 에러를 뿜어냈다. 포기하지 않고 계속 찾아다니던 중, 아예 php 스크립트를 기반으로 작성한 암호화 함수를 발견하였다.

// PHP암호화 함수
function encrypt($data,$k) {
 $encrypt_these_chars = "1234567890ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz.,/?!$@^*()_+-=:;~{}";
 $t = $data;
 $result2;
 $ki;
 $ti;
 $keylength = strlen($k);
 $textlength = strlen($t);
 $modulo = strlen($encrypt_these_chars);
 $dbg_key;
 $dbg_inp;
 $dbg_sum;
 for ($result2 = "", $ki = $ti = 0; $ti < $textlength; $ti++, $ki++) {
  if ($ki >= $keylength) {
   $ki = 0;
  }
  $dbg_inp += "["+$ti+"]="+strpos($encrypt_these_chars, substr($t, $ti,1))+" "; 
  $dbg_key += "["+$ki+"]="+strpos($encrypt_these_chars, substr($k, $ki,1))+" "; 
  $dbg_sum += "["+$ti+"]="+strpos($encrypt_these_chars, substr($k, $ki,1))+ strpos($encrypt_these_chars, substr($t, $ti,1)) % $modulo +" ";
  $c = strpos($encrypt_these_chars, substr($t, $ti,1));
  $d;
  $e;
  if ($c >= 0) {
   $c = ($c + strpos($encrypt_these_chars, substr($k, $ki,1))) % $modulo;
   $d = substr($encrypt_these_chars, $c,1);
   $e .= $d;
  } else {
   $e += $t.substr($ti,1);
  }
 }
 $key2 = $result2;
 $debug = "Key  : "+$k+"\n"+"Input: "+$t+"\n"+"Key  : "+$dbg_key+"\n"+"Input: "+$dbg_inp+"\n"+"Enc  : "+$dbg_sum;
 return $e . "";
}

인코딩은 $edata = encrypt($data,$key); 으로 데이터와 키값만 입력하면 된다.

php 디코딩

function decrypt($key2,$secret) {
 $encrypt_these_chars = "1234567890ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz.,/?!$@^*()_+-=:;~{}";
 $input = $key2;
 $output = "";
 $debug = "";
 $k = $secret;
 $t = $input;
 $result;
 $ki;
 $ti;
 $keylength = strlen($k);
 $textlength = strlen($t);
 $modulo = strlen($encrypt_these_chars);
 $dbg_key;
 $dbg_inp;
 $dbg_sum;
 for ($result = "", $ki = $ti = 0; $ti < $textlength; $ti++, $ki++) {
  if ($ki >= $keylength){
   $ki = 0;
  }
  $c = strpos($encrypt_these_chars, substr($t, $ti,1));
  if ($c >= 0) {
   $c = ($c - strpos($encrypt_these_chars , substr($k, $ki,1)) + $modulo) % $modulo;
   $result .= substr($encrypt_these_chars , $c, 1);
  } else {
   $result += substr($t, $ti,1);
  }
 }
 return $result;
}

마찬가지로 디코딩 과정은 $ddata = decrypt($data,$key); 이면 끝.
이 함수 아니었으면 지금도 뻘짓하고 있었을지도..
땡큐땡큐

번호 제목 날짜 조회 수
21 Table 태그 file 2010.05.23 4440
20 포커스 요소의 테두리와 웹 접근성 file 2010.05.23 4179
19 리눅스 자동 시작 file 2010.05.21 15892
18 putty file 2010.05.21 13464
17 php 에서 파일 권한 설정 2010.05.21 4593
16 list-style file 2010.05.21 5154
15 jQuery 쿠키 file 2010.05.19 5016
14 php 쿠키 생성, 읽기 file 2010.05.19 7103
13 php 에서 텍스트 파일을 생성, 수정하기 file 2010.05.19 9922
12 파일 불러오기 file 2010.05.17 5471
» php 암호화와 복호와 file 2010.05.17 7305
10 php 현재 시각 출력하기 file 2010.05.17 4458
9 html 파일에서 php 구문 숨기기 file 2010.05.17 6860
8 검색엔진 등록 file 2010.05.12 142340
7 VPS (가상 호스팅) 비교 file 2010.05.12 62200
6 sAPM file 2010.05.12 20260
5 Lighttpd 설치 file 2010.05.11 20677
4 Zend Optimizer + eAccelerator + Suhosin file 2010.05.11 18247
3 PHP 설치 file 2010.05.11 15056
2 Apache 설치 file 2010.05.11 16656