php php 암호화와 복호와
2010.05.18 03:21
참고 문서 |
---|
XE 공식 자료실
XE 공식 자료실 모듈은 제목에 나와있듯이 자료실 운영에 매우 유리하다. 그런데 이 모듈은 다운로드 권한을 부여할 때, 모듈 단위로 지정한다. 즉 10가지 각기 다른 권한이 있으면 자료실도 10개가 있어야 한다는 뜻. 내가 원하는 자료실은 조금 다른 형태로서, 각 회원에게 부여된 고유 권한에 따라 파일 다운로드 권한이 발생하는 것이었다. 또한 코드의 간결성을 위해 스킨상에서만 링크를 제어하는 것이다.
보안
각 회원마다 다운로드 권한을 부여하기 위해 열심히 고민했다. 많은 시간이 소요된 것은 사실이지만, 덕분에 php 에 대해 어느정도 익숙해진 것 같다. 아무튼 내가 생각한 방법은 크게 3가지가 있다.
링크 숨기기
먼저 한 가지는 권한이 있는 유저에게만 링크를 제공하는 것이다. if 구문을 사용한 쉽고 간편한 방법이다. 하지만 한번 노출된 url은 제3자에게도 다운로드 권한이 부여된다. form 태그를 사용하면 좀 더 안전하지만, 기본적인 지식으로도 제3자에게 파일을 받을 수 있는데는 변함이 없다.
모듈 제작
가장 확실한 방법으로 db 정리나 XE 호환성에 매우 유리하다. 하지만 불필요한 모듈을 하나 늘리게 되는 단점이 있다. 내 목표는 스킨에서만 링크를 제어하는 것이기 때문에 추가 모듈은 무의미했다.
비밀번호와 암호화
내가 선택한 방법으로, 파일 정보를 비밀번호와 결합시켜 다운로드를 제공한다. form 태그의 정보가 모두 노출되어도 비밀번호를 모르면 파일을 받을 수 없다. 지금은 실력부족으로 독립된 php 파일에서 다운로드를 처리하는게 매우 아쉽다.
php 인코딩
php를 암호화하는 방법에는 다양한 방법이 있지만, 자료실을 제작할 때 두가지 조건은 반드시 충족해야 했다.
- 암호화된 정보는 제3자가 복호화할 수 없어야 한다.
- 암호화된 정보는 원래대로 살릴 수 있어야 한다.
이 조건을 만족하기 위해 많은 시간을 삽질했으며, 발견한 php 함수들은 모두 에러를 뿜어냈다. 포기하지 않고 계속 찾아다니던 중, 아예 php 스크립트를 기반으로 작성한 암호화 함수를 발견하였다.
// PHP암호화 함수
function encrypt($data,$k) {
$encrypt_these_chars = "1234567890ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz.,/[email protected]^*()_+-=:;~{}";
$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.,/[email protected]^*()_+-=:;~{}";
$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); 이면 끝.
이 함수 아니었으면 지금도 뻘짓하고 있었을지도..
땡큐땡큐
댓글 0
번호 | 제목 | 날짜 | 조회 수 |
---|---|---|---|
12 |
파일 불러오기
![]() | 2010.05.18 | 5464 |
» |
php 암호화와 복호와
![]() | 2010.05.18 | 7220 |
10 |
php 현재 시각 출력하기
![]() | 2010.05.17 | 4448 |
9 |
html 파일에서 php 구문 숨기기
![]() | 2010.05.17 | 6845 |
8 |
검색엔진 등록
![]() | 2010.05.13 | 142338 |
7 |
VPS (가상 호스팅) 비교
![]() | 2010.05.13 | 62197 |
6 |
sAPM
![]() | 2010.05.12 | 20246 |
5 |
Lighttpd 설치
![]() | 2010.05.12 | 20675 |
4 |
Zend Optimizer + eAccelerator + Suhosin
![]() | 2010.05.12 | 18197 |
3 |
PHP 설치
![]() | 2010.05.12 | 15053 |
2 |
Apache 설치
![]() | 2010.05.12 | 16651 |
1 |
MySQL 설치
![]() | 2010.05.12 | 17273 |