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
번호 | 제목 | 날짜 | 조회 수 |
---|---|---|---|
41 | <table cellspacing="0"> | 2010.08.19 | 5486 |
40 | 파일 불러오기 | 2010.05.17 | 5473 |
39 | list-style | 2010.05.21 | 5155 |
38 | jQuery 쿠키 | 2010.05.19 | 5021 |
37 | php 에서 파일 권한 설정 | 2010.05.21 | 4594 |
36 | 서식문자 출력 대상(자료형) 출력 형태 | 2014.04.06 | 4479 |
35 | php 현재 시각 출력하기 | 2010.05.17 | 4459 |
34 | Table 태그 | 2010.05.23 | 4443 |
33 | 포커스 요소의 테두리와 웹 접근성 | 2010.05.23 | 4182 |
32 | 브라우저, 문서 높이 구하기 | 2010.08.17 | 3947 |
31 | 네이버 드래그, 마우스 우클릭 방지 해제 | 2010.07.25 | 3621 |
30 | 마인크래프트 다운로드 v1.4 | 2011.04.01 | 3371 |
29 | date — 로컬 날짜/시간을 형식화합니다 | 2014.07.03 | 2610 |
28 | 75mb 페이지에 lazy load 적용해보기 | 2014.09.03 | 2607 |
27 | 스패머 알려주는 사이트 | 2014.09.11 | 2447 |
26 | netdata 이용한 centos 모니터링 | 2020.01.25 | 2349 |
25 | 접속하기전에.. | 2011.04.01 | 2342 |
24 | [뻘글] 컴퓨터의 언어와 사람의 기억법 | 2014.06.24 | 2214 |
23 | XE Core 최적화 - html/js/css | 2014.11.07 | 2170 |
22 | mysql DELETE 쿼리 사용할 때 실제로 rows 삭제가 발생했는지 알 수 있는가? | 2023.06.21 | 2078 |