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
번호 | 제목 | 날짜 | 조회 수 |
---|---|---|---|
81 | windows hardware encrypt ssd | 2024.01.23 | 212 |
80 | php 에서 비동기 처리하는 방법 | 2023.06.22 | 294 |
79 | mysql DELETE 쿼리 사용할 때 실제로 rows 삭제가 발생했는지 알 수 있는가? | 2023.06.21 | 2088 |
78 | gearman 은 무엇인가? | 2023.06.21 | 276 |
77 | apache2 AllowOverride config | 2023.05.23 | 284 |
76 | mysqldump from remote db to my local server. | 2023.05.04 | 421 |
75 | To download large files with rsync command. | 2023.05.04 | 21 |
74 | The best configuration of php7.4-fpm / 8GB | 2023.05.04 | 23 |
73 | The best configuration of php7.4-fpm / 1.5GB | 2023.05.04 | 23 |
72 | net::ERR_CONNECTION_REFUSED | 2021.10.11 | 0 |
71 | php-fpm tcp to socket | 2020.01.25 | 0 |
70 | netdata 이용한 centos 모니터링 | 2020.01.25 | 2349 |
69 | vmware with centos 7 | 2019.08.23 | 0 |
68 | xe 에디터 컴포넌트 트리거 제거 | 2019.05.16 | 9846 |
67 | my.cnf | 2019.04.11 | 1 |
66 | certbot apache multiple domain | 2019.04.10 | 1416 |
65 | yum install latest redis | 2019.03.27 | 1682 |
64 | yum install php-apcu | 2019.03.12 | 1542 |
63 | 웹 백업 (쉘 스크립트) | 2018.10.14 | 1194 |
62 | mysql 백업 (shell script) | 2018.10.14 | 697 |