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); 이면 끝.
이 함수 아니었으면 지금도 뻘짓하고 있었을지도..
땡큐땡큐

번호 제목 날짜 조회 수
81 vmware with centos 7 secret 2019.08.23 0
80 php-fpm tcp to socket secret 2020.01.25 0
79 net::ERR_CONNECTION_REFUSED secret 2021.10.11 0
78 my.cnf secret 2019.04.11 1
77 The best configuration of php7.4-fpm / 8GB 2023.05.04 18
76 To download large files with rsync command. 2023.05.04 18
75 The best configuration of php7.4-fpm / 1.5GB 2023.05.04 20
74 windows hardware encrypt ssd 2024.01.23 124
73 gearman 은 무엇인가? 2023.06.21 169
72 apache2 AllowOverride config 2023.05.23 174
71 php 에서 비동기 처리하는 방법 2023.06.22 209
70 mysqldump from remote db to my local server. 2023.05.04 416
69 yum install php 7.1 [6] 2018.10.10 686
68 mysql 백업 (shell script) file 2018.10.14 692
67 munin 설치 2018.10.13 785
66 yum install mariadb [2] 2018.10.10 1142
65 웹 백업 (쉘 스크립트) file 2018.10.14 1190
64 certbot apache multiple domain 2019.04.10 1411
63 yum install php-apcu 2019.03.12 1538
62 yum install latest redis file 2019.03.27 1678