php php 암호화와 복호와
2010.05.17 18: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.,/?!$@^*()_+-=:;~{}";
$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); 이면 끝.
이 함수 아니었으면 지금도 뻘짓하고 있었을지도..
땡큐땡큐
댓글 0
번호 | 제목 | 날짜 | 조회 수 |
---|---|---|---|
21 |
Table 태그
![]() | 2010.05.23 | 4672 |
20 |
포커스 요소의 테두리와 웹 접근성
![]() | 2010.05.23 | 4341 |
19 |
리눅스 자동 시작
![]() | 2010.05.21 | 16090 |
18 |
putty
![]() | 2010.05.21 | 13643 |
17 | php 에서 파일 권한 설정 | 2010.05.21 | 4843 |
16 |
list-style
![]() | 2010.05.21 | 5366 |
15 |
jQuery 쿠키
![]() | 2010.05.19 | 5175 |
14 |
php 쿠키 생성, 읽기
![]() | 2010.05.19 | 7373 |
13 |
php 에서 텍스트 파일을 생성, 수정하기
![]() | 2010.05.19 | 10180 |
12 |
파일 불러오기
![]() | 2010.05.17 | 5723 |
» |
php 암호화와 복호와
![]() | 2010.05.17 | 7610 |
10 |
php 현재 시각 출력하기
![]() | 2010.05.17 | 4725 |
9 |
html 파일에서 php 구문 숨기기
![]() | 2010.05.17 | 7114 |
8 |
검색엔진 등록
![]() | 2010.05.12 | 142494 |
7 |
VPS (가상 호스팅) 비교
![]() | 2010.05.12 | 62366 |
6 |
sAPM
![]() | 2010.05.12 | 20461 |
5 |
Lighttpd 설치
![]() | 2010.05.11 | 20873 |
4 |
Zend Optimizer + eAccelerator + Suhosin
![]() | 2010.05.11 | 18452 |
3 |
PHP 설치
![]() | 2010.05.11 | 15259 |
2 |
Apache 설치
![]() | 2010.05.11 | 16845 |