태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

마우스 오버시 사진변환, 파일에러시 대체이미지 적용(소스일부)

       <tr>
        <td align="center" style="padding:5 0 10 0">
         <img src="<?=$file1?>" onerror="this.src='noimage.jpg'" name="deimg" width="550" height="413" border="2" style="border-color:#ffffff">
        </td>
       </tr>
       <tr>
        <td>
         <table border="0" cellpadding="0" cellspacing="10" align="center">
          <tr>
   <?
   
       $ff1 = explode(".", $row->upfile);
       $file = "../../city/upfile/".$ff1[0];
                   if(is_file($file.".jpg")) $file1 = $file.".jpg";
       else if(is_file($file.".JPG")) $file1 = $file.".JPG";
                   else if(is_file($file.".gif")) $file1 = $file.".gif";
       else if(is_file($file.".GIF")) $file1 = $file.".GIF";
                   else if(is_file($file.".bmp")) $file1 = $file.".bmp";
                   if(is_file($file1)) echo "<td><img src='$file1' width='80' height='60' border='2' style='border-color:#ffffff' onMouseOver=document.deimg.src='$file1' style='cursor:hand'></td>";
?>

int imagecreatefromjpeg (string filename)

- 화일또는 url로 부터 jpg화일을 생성하는 함수

- $im = @ImageCreateFromJPEG ($imgname);

--------------------------------------------------------------------------------------------------------


int imagecolorallocate (int im, int red, int green, int blue)

- 이미지를 위한 색을 할당하는 함수

- $color = ImageColorAllocate ($im, 255, 255, 255);

--------------------------------------------------------------------------------------------------------


int imagestring (int im, int font, int x, int y, string s, int col)

- 이미지에 원하는 위치(x,y)에 원하는 색(col)으로 문자열(string)을 쓴다

- font 인수는 1에서 5까지, col 인수는 imagecolorallocate() 함수에서 할당한 색의 값을 사용

- ImageString ($im, 1, 5, 5, "hahahaha", $color);

--------------------------------------------------------------------------------------------------------


int imagejpeg (int im [, string filename [, int quality]])

- 이미지를 화일로 만들거나 웹브라우져에 출력한다

- filename 인수을 사용하면 인수에 주어진 이름으로 화일을 만든다, quality 는 압축율(백분율)을 의미한다

- Imagejpeg($im);

--------------------------------------------------------------------------------------------------------


int imagefilledrectangle (int im, int x1, int y1, int x2, int y2, int col)

- 이미지에 직사각형을 그린다
- x1,y1 인수는 왼쪽상단 시작부분이고 y2,y2 왼쪽하단 마지막부분이다

- ImageFilledRectangle ($im, 0, 0, 150, 30, $color);

--------------------------------------------------------------------------------------------------------


array imagettftext (int im, int size, int angle, int x, int y, int col, string fontfile, string text)

- 이미지에 트루타입 글꼴을 이용해서 문자열을 쓴다

- fontfile 인수는 트루타입 글꼴화일 이름이나 경로를 쓴다, size는 글꼴의 크기, angle는 각을 의미함

- 문자열 길이에 제한이 있다 255자 까지만 사용할수 있다

- ImageTTFText ($im, 20, 0, 10, 20, $color, "/path/arial.ttf", "Testing... Omega: &#937;");

--------------------------------------------------------------------------------------------------------


int imagedestroy (int im)

- 이미지를 삭제한다

- imagedestroy($im);

--------------------------------------------------------------------------------------------------------


int imagetypes (void)

- 이미지의 타입을 되돌려준다

- 되돌려 주는 값 IMG_GIF, IMG_JPG, IMG_PNG, IMG_WBMP

- $image_type = imagetypes();

--------------------------------------------------------------------------------------------------------

int imageline (int im, int x1, int y1, int x2, int y2, int col)

- 이미지에 선을 그린다

- imageline($im, 0, 0, 150, 30, $color);


--------------------------------------------------------------------------------------------------------


int imagecreate (int x_size, int y_size)

- 새로운 이미지를 생성한다

- x_size인수는 넓이 y_size 인수는 높이

- $im = @ImageCreate (50, 100)


--------------------------------------------------------------------------------------------------------


int imagesy (int im) or int imagesx (int im)

- 이미지의 높이와 넓이를 리턴한다

- $im_height = imagesy($im);

- $im_widht = imagesx($im);


--------------------------------------------------------------------------------------------------------


int imagecopyresized (int dst_im, int src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

- 이미지의 크기를 원하는 크기로 변경 한다음 저장함

- $new_w=100;
$new_h=100;

$dst_img=ImageCreate($new_w,$new_h);
$src_img=ImageCreateFromGif("./imgtest.gif");

ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));



--------------------------------------------------------------------------------------------------------

int imagestringup (int im, int font, int x, int y, string s, int col)

- 이미지에 문자를 수직으로 쓴다

- font인수는 1부터 5까지 사용할수 있다

- imagestringup($im, 1, 5, 5, "hahahaha", $color);


--------------------------------------------------------------------------------------------------------


int imagecreatefromstring (string image)

- 문자열에 있는 이미지 스크림($im)으로 부터 새로운 이미지를 만든다


--------------------------------------------------------------------------------------------------------



int imagecolortransparent (int im [, int col])

- 이미지의 특정색을 투명이미지로 만든다

- $im = imagecreate(100,100);
$color = ImageColorAllocate($im, 255, 0, 0);
$trans = imagecolortransparent($im, $color);

- ImageColorTransparent($im_str, $black);


--------------------------------------------------------------------------------------------------------


int imagecolorstotal (int im)

- 이미지의 팔레트에 있는 색의 갯수를 리턴한다

- $color_total = imagecolorstotal ($im);

--------------------------------------------------------------------------------------------------------

int imagecolorat (int im, int x, int y)

- 이미지에서 특정위치에서 1픽셀의 색값을 얻는다

- $color_index = imagecolorat($im, $start_x, $start_y);

--------------------------------------------------------------------------------------------------------


array imagecolorsforindex (int im, int index)

- 이미지에 imagecolorat()를 실행한 값으로 부터 RGB 값을 배열로 되돌려준다

- $color_tran = imagecolorsforindex($im, $color_index);

$color_tran["red"] $color_tran["green"] $color_tran["blue"]
Tag // GD

<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tr>
  <td><strong><font color="#FFFFFF">번호</font></strong></td>
  <td><strong><font color="#FFFFFF">제목</font></strong></td>
  <td><strong><font color="#FFFFFF">작성자</font></strong></td>
  <td><strong><font color="#FFFFFF">작성일</font></strong></td>
  <td><strong><font color="#FFFFFF">평점</font></strong></td>
 </tr>
 <?
 $code="게시판 코드명";
 include "../게시판정보경로";
 $sql = "select * from 테이블명 where code = '$code' and notice != 'Y' and prdcode='$prdcode' order by prino desc";
 $result = mysql_query($sql) or error(mysql_error());

 if($bbs_info->rows == "") $bbs_info->rows = 20;
 if($bbs_info->lists == "") $bbs_info->lists = 5;

 $total = mysql_num_rows($result);
 $page_count = ceil($total/$bbs_info->rows);
 if(!$page || $page > $page_count) $page = 1;
 $start = ($page-1)*$bbs_info->rows;
 $no = $total-$start;
 if($start>1) mysql_data_seek($result,$start);

 while(($row = mysql_fetch_object($result)) && $bbs_info->rows)
 {
?>
<script>
 var tt<?=$no?> = 1;
 function div_view_<?=$no?>(){
  if(tt<?=$no?>==1){
   document.all.cview_<?=$no?>.style.display="";
   tt<?=$no?> = 0;
  }else{
   document.all.cview_<?=$no?>.style.display="none";    
   tt<?=$no?> = 1;
  }
 }
</script>
<?
  if($row->privacy == "Y")
  {
   $row->subject = "<span onclick='div_view_$no();' style='cursor:hand'>$row->subject</span> <img src=/images/bbsimg/lock.gif>";
   $row->content = "비밀글입니다. 게시판으로 이동후 비밀번호를 입력하세요.";
  }
  else
  {
    $row->subject = "<span onclick='div_view_$no();' style='cursor:hand'>$row->subject</span>";
  }
  $re_space = ""; for($ii=0; $ii < $row->depno; $ii++) $re_space .= "&nbsp;&nbsp;";   // respace
  $row->subject = $re_space.$row->subject;
  if($row->depno != 0) $row->subject = "<img src=/images/bbsimg/re.gif>".$row->subject;  // re
  switch($row->star)
  {
   case 1:
    $star = "/img/icon_star_1";
    break;
   case 2:
    $star = "/img/icon_star_2";
    break;
   case 3:
    $star = "/img/icon_star_3";
    break;
   case 4:
    $star = "/img/icon_star_4";
    break;
   case 5:
    $star = "/img/icon_star_5";
    break;
  } 
?>
 <tr>
  <td align="center" height="25"><?=$no?></td>
  <td><?=$row->subject?></td>
  <td align="center"><?=$row->name?></td>
  <td align="center"><?=$row->wdate?></td>
  <td align="center"><img src="<?=$star?>.gif"></td>
 </tr>
 <tr>
  <td colspan="5" style="padding: 10 20 20 20">
<div id="cview_<?=$no?>" style="display:none">  
    <?=$row->content?><br>
    <a href="/bbs/input.php?code=review&prdcode=<?=$prdcode?>&mode=reply&idx=<?=$row->idx?>"><strong>[ 답변하기 ]</strong></a>
</div>
  </td>
 </tr>

 <tr>
  <td colspan="5" height="1" background="/images/bbsimg/board_bg.gif"></td>
 </tr>
<?
  $no--;
  $bbs_info->rows--;
 }
?>
</table>


 - 년과 월의 순차번호 생성...
 - 월이 바뀔시 순차번호 리셋

 $date1 = date(y).date(m);                             //년과 월   ex)0706
 $uno_sub = explode("-",$기존데이터변수);   //기존 데이터 "-"문자로 배열화
 if($uno_sub[0]==$date1)                               //기존데이터와 년월이 같을때
 {
     $uno1 = (int)$uno_sub[1];                        //기존데이터의 [1]배열
    $uno2 = $uno1+1;                                       //기존데이터 + 1
     $uno11 = sprintf('%05d',$uno2);                //sprintf를 이용 5자리의 숫자, 공백시 0으로 대체
 }
 else { $uno11 = sprintf('%05d',1);}
               //기존데이터와 년월이 다르면 "00001"
    $uno = $date1."-".$uno11;                              //고유번호 생성 $uno     ex)0706-00001



Tag // sprintf
 

setcookie 사용시 다음과 같은 에러가 발생할수가 있다.

Warning: Cannot modify header information - headers already sent by
...................................

setcookie함수는 페이지 출력전에 호출이 되어야 합니다.

아니면 캐쉬해서 한번에 출력한다.

캐쉬방법은 ob_start() 참고하여서 사용.

http://ir.php.net/manual/kr/function.ob-start.php

 

수정전 SetCookie("user_id", $ID_USER, 0, "/");  

이런  방식으로 사용하던 방식을(상단에 있으면 상관없으나 중간이나 페이지 출력후에 사용 하였으면 수정필요)

수정후 here_setcookie("user_id",$ID_USER, 0);   이런식으로 수정하여 사용한다.

추가 내용
function here_setcookie($name, $value, $expire, $path='/')
{
    if (headers_sent()) {
        $cookie = $name.'='.urlencode($value).';';
        if ($expire) $cookie .= ' expires='.gmdate('D, d M Y H:i:s', $expire).' GMT';
        echo '<script language="javascript">document.cookie="'.$cookie.'";</script>';
    } else {
        setcookie($name, $value, $expire, $path);
    }

}

출처 : http://blog.naver.com/nugu99/70008603717


     $today = time()-(60 * 60 * 24 *
설정일);
         
      //현재시간 타임스템프값 - 설정 일자 타임스템프값
     $wday = explode(" ",$row->wdate);
                   
      
//작성일 날짜와 시간으로 분리
     $wday = explode("-",$wday[0]);
                       
     
//날짜부분을 년, 월, 일 로 분리
     $wtime = explode(":",$wday[1]);
                       
     
//시간부분을 시, 분, 초 로 분리

      //mktime(시,분,초,월,일,년 순)함수로 위의 값을 이용하여 작성일자의 타임스템프값 추출
     $wday = mktime($wtime[0],$wtime[1],$wtime[2],$wday[1],$wday[2],$wday[0]);

    //설정일의 타임스템프값과 작성일값을 비교
     if($today < $wday) {
$new_icon = " NEW 표시 "; }
     else{ $new_icon = ""; }

외국인은 주민등록번호가 없습니다.


대신 외국인 등록번호란게 있지요.

자리수는 같습니다만 인증방법이 완전 다릅니다.

이 자료는 외국인 등록번호 인증 스크립트 입니다.

php, javascript, c, asp 로 구성되어있습니다.




출처 : sanso.pe.kr

 

접속된 DB의 설정된 테이블의 모든 데이터를 엑셀 파일로 다운로드 받는 소스 입니다.
===================================================
<?
$connect_host        = "localhost";
$connect_id        = "DB아이디";
$connect_pass        = "DB비밀번호";
$connect_db        = "DB이름";
$connect_table        = "테이블이름";
$xls_filename        = "filename.xls";

$connect=@mysql_connect($connect_host,$connect_id,$connect_pass);
$mysql=@mysql_select_db($connect_db,$connect);

header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$xls_filename");
?> 

<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=EUC-KR>
</head>
<body>
<table border=1>
<tr align=center>
<?
$fields = mysql_list_fields("$connect_db", "$connect_table");
$columns = mysql_num_fields($fields);

for ($i = 0; $i < $columns; $i++) {
$field[$i]=mysql_field_name($fields, $i);
  echo "<th>".$field[$i]. "</th>";
}
?>
</tr>

<?
$result=mysql_query("select * from $connect_table");
while($data=mysql_fetch_assoc($result)){
echo"<tr>";

for ($i = 0; $i < sizeof($field); $i++) {
echo "<td>".$data["$field[$i]"]."</td>";
}

echo"</tr>";
}
?>
</table>
</body>
</html>  


출처 : http://blog.naver.com/noend331/80004628361

Tag // excel
<html>
<head>
<title>::고객에게 SMS발송 ::</title>
<link href="../style.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
<!--
// 주문상세내역 보기
function inputCheck(frm){
 
 if(frm.hphone.value == ""){
  alert("받는이 휴대폰번호를 입력하세요");
  frm.hphone.focus();
  return false;
 }

 if(frm.content.value == ""){
  alert("내용을 입력하세요");
  frm.content.focus();
  return false;
 }
}

function calByte(aquery){
 
 var tmpStr;
 var temp = 0;
 var onechar;
 var tcount = 0;;

 tmpStr = new String(aquery);
 temp = tmpStr.length;
 for(k=0; k<temp; k++) {
  onechar = tmpStr.charAt(k);
  if(escape(onechar).length > 4) {
   tcount += 2;
  } else if(onechar != '\n' || onechar != '\r') {
   tcount++;
  }
 
  frm.sms_byte.value = tcount+"/80 bytes";
 
  if(tcount > 80) {
   alert("메시지내용은 80 바이트 이상 전송할 수 없습니다.");
   
   cutText(frm.sms_msg.value);
   
   return;
  }
 }
 if ( temp == 0 ) {
 
  frm.sms_byte.value = "0/80 bytes";
 
 }
}

function cutText(aquery) {
 
 var tmpStr;
 var temp=0;
 var onechar;
 var tcount = 0;

 tmpStr = new String(aquery);
 temp = tmpStr.length;
 for(t=0; t<temp; t++){
  onechar = tmpStr.charAt(t);
  if(escape(onechar).length > 4) {
   tcount += 2;
  } else if(onechar != '\n' || onechar != '\r') {
   tcount++;
  }
  if(tcount > 80) {
   tmpStr = tmpStr.substring(0, t);
   break;
  }
 }
 
 document.frm.sms_msg.value = tmpStr;
 
 calByte(tmpStr);       
}

function checkSmsmsg(){
 
 var tmpStr = document.frm.sms_msg.value;
 
 calByte(tmpStr);

}


//-->
</script>
</head>
<body topmargin=0 leftmargin=0>
<table width="100%" border="0" cellpadding=0 cellspacing=0>
  <tr>
    <td height=35 bgcolor="659EBE">
      <font color="ffffff"><b>:: 고객에게 SMS발송 ::</b></font>
    </td>
    <td bgcolor="659EBE" align="right"></td>
  </tr>
</table>
<table width="100%" border="0" cellpadding=0 cellspacing=0>
<form name="frm" action="member_save.php" method="post" onSubmit="return inputCheck(this);">
<input type="hidden" name="mode" value="sendsms">
<input type="hidden" name="se_name" value="보내는이">
<input type="hidden" name="se_tel" value="보내는이 번호">

  <tr><td height=1 colspan=3></td></tr>
  <tr bgcolor=f0f0f0 align=center>
    <td colspan="2" height="5"></td>
  </tr>
  <tr>
    <td height="30" width="150" align=center>보내는이</td>
    <td> : 이름(전화번호)</td>
  </tr>
  <tr><td height=1 bgcolor="f0f0f0" colspan=2></td></tr>
  <tr>
    <td height="30" align=center>받는휴대폰</td>
    <td> : <input type="text" name="hphone" value="<?=$hphone?>" class="form3"></td>
  </tr>
  <tr><td height=1 bgcolor="f0f0f0" colspan=2></td></tr>
  <tr>
    <td colspan="2" align="center">
    <textarea name="sms_msg" rows="12" cols="36" class="textarea2" onKeyDown="checkSmsmsg();"></textarea>
    <input type="text" name="sms_byte" size="11" style="height:14px; border: 1px solid #91FBFF; ; font-size:8pt; font-family:돋움; background-color:#91FBFF" value="0/80 bytes" onfocus="this.blur()">
    </td>
  </tr>
  <tr><td height=1 bgcolor="f0f0f0" colspan=2></td></tr>
  <tr><td height="10"></td></tr>
  <tr>
    <td align="center" colspan="2">
      <input type="submit" value=" 발 송 " class="t"> &nbsp;
      <input type="button" value=" 닫 기 " onClick="self.close();" class="t">
    </td>
  </tr>
</form>
</table>
</body>
</html>

암호화

암호화(Cryptography)는 일종의 예술이다. 암호문은 몇 개의 단어를 바꾼 로마의 궤변에서부터 요즘에 사용하는 공개 키와 개인 키(public and private key) 메커리즘에 이르기까지 여러 세기에 걸쳐 사용되었다. 암호화의 목적은 지정된 사람 이외에는 누구도 볼 수 없는 암호문을 만드는 것이다.

이제 몇 페이지에 요즈음 인터넷에서 사용되는 몇 가지 암호화 방식과 동작 원리, 사용대상 등에 대해 살펴보도록 하자.

단방향 암호화

이 방식은 원문을 해독할 수 없도록 암호화하는 과정이다. 언뜻 들으면 사용할 수 없는 방법 같지만 실제 컴퓨터 분야에서는 많이 사용되는 방법이다.

단방향 암호화에 사용되는 알고리즘은 자주 해싱 알고리즘(hashing algorithms)이라고 부른다. 이것은 원문을 이용해 고유한 문자열을 만들어 내는 과정이다. PHP에서 가장 널리 사용되는 해싱 알고리즘은 MD5 알고리즘이다. 이 알고리즘의 실제 동작 방식에 대해서는 자세히 설명하지 않지만 이 방식은 어떤 문자열을 받아서 128비트로 된 고유한 값(fingerprint)을 만들어 내는 것이다.

현재 이 고유한 값을 이용해 거꾸로 원래의 문자열을 알아내는 방법은 불가능하다고 생각된다. 또한 두 가지 문자열에서 생성된 값이 서로 같게 될 확률도 거의 없다. 이 시스템을 완전히 난공불락으로 생각할 수도 있지만, 예상 가능한 문자열을 이용해 무작위로 입력해 그 결과를 비교하는 방법에는 취약하다. 이 공격에 필요한 시간은 해시 데이터의 복잡성에 따라 다르지만 짧은 암호 해독에 걸리는 시간은 그리 길지 않다.

암호가 안전하기만 하다면 MD5 알고리즘은 암호를 암호화하는 좋은 방법이다. 그 이유는 원래의 암호를 다시 해독할 수는 없지만 로그인 시에 사용자가 입력한 암호를 해시로 만들어 비교할 수는 있기 때문이다.

일반 텍스트로 저장된 암호는 보안상 매우 위험하면 MD5 알고리즘을 이용해 변환된 값을 저장해야 한다. 사용자가 로그인해 자신의 암호를 입력하면 이것은 MD5 암호화 과정을 거치게 된다. 만일 이 해시 값이 이미 저장되어 있던 것과 같으며, 두 개의 암호는 서로 같다고 판단된다.

간단한 암호를 사용하는 것은 브루트 포스 공격(brute force attack)의 대상이 되기 때문에 매우 위험하다는 것을 명심하기 바란다. 안전한 암호를 선택하는 방법은 이 장의 끝에 나와 있는 참고 자료를 이용하면 된다.

PHP의 md5() 함수는 다음과 같이 문자열을 입력받아 고유한 값을 만들어 낸다:

<?php
$fingerprint = md5($password);
?>

Important

MD5 알고리즘은 다양한 용도로 사용된다. 그 중하나는 파일이 수정되었는지를 확인할 때 사용된다는 것이다. 파일의 MD5 해시를 저장해 두면 이 파일이 변경되었는지를 금방 확인할 수 있다.


CRC32 함수도 비슷한 기능을 한다. CRC32 함수는 128비트가 아닌 32비트의 고유 값을 생성하기 때문에 암호에는 적당하지 않다. 따라서 두 개의 입력 값이 같은 결과를 나타탤 확률이 더 높다.

MD5와 CRC32 함수 이외에, PHP는 mhash 라이브러리를 제공한다. 이 추가적인 알고리즘는 mhash() 함수를 이용한다. 이 함수는 두 개 또는 세 개의 인자를 사용한다. 첫 번째 인자는 알고리즘을 나타내는 상수, 두 번재 인자는 해시로 만들 문자열, 세 번째 인자는 해싱 알고리즘에서 사용되는 키(key)이다. 다음은 MD5 알고리즘과 mhash()를 이용한 해싱의 예이다:

<?php
$passphrase = "this is my secret passphrase";
echo("My passpharse hashed using md5 is: ");
echo(mhash(MASH_MD5, $passphrase));
?>

mhash를 지원하는 주요 알고리즘은 다음과 같다. 좀더 자세한 정보는
http://mhash.sourceforce.net/ 을 참고하면 된다.

알고리즘
특징

CRC32
이 알고리즘은 주로 데이터 전송 시에 체크섬(checksums)을 위해 사용된다. mhash는 이 알고리즘을 위해 두 가지를 제공하는데, MHASH_CRC32는 주로 이더넷 통신에서 사용되면 MHASH_CRC32는 ZIP 프로그램에서 사용된다.

MD5
md5() 함수의 알고리즘이다. 상수 MHASH_MD5를 사용한다.

MD4
MD4는 MD5와 비슷하지만 보안성이 떨어진다. MD5로 대체되었기 때문에 MD4를 사용하지 않는다. MHASH_MD4 상수를 사용한다.

SHA1
이 알고리즘은 NIST의 디지털 서명 표준을 사용된다. 상수 MHASG_SHA1을 사용한다.

HAVAL
MD5의 변형 판으로 다양한 길이의 결과를 갖는다. mhash에서는 MHASH_HAVAL256, MHASH_MAVAL192, MHASH_HAVAL160, MHASH_HAVAL128 등을 사용한다.

RIPEMD160
MD4, MD5, RIPEMD를 대체하기 위해 설계된 160비트 알고리즘이다. 그러나 여전히 MD5가 많이 사용되고 있다. 상수 MHASH_RIPEMD160을 이용한다.

TIGER
TIGER은 매우 빠른 해싱 기능을 위해 설계되었다. 원래 64비트 컴퓨터에서 사용하려고 설계되었지만 다른 컴퓨터에서 그다지 느리지는 않다. 상수 MHASH_TIGER192, MHASH_TIGER160, MHASH_TIGER128을 사용한다.

GOST
러시아의 디지털 서명 표준으로 256비트를 지원한다. 상수 MHASH_GOST를 사용한다.


대칭형 암호화(Symmetric Encryption)

키(key)를 이용해 문자열을 암호화하는 방버이다. 전송자와 수신자가 알고 있는 키를 이용해 동일한 알고리즘에서 문자열을 암호화/복호화 한다. 2차 세계 대전 중에 암호화 기계(enigma machine)에 사용된 방식이다.

이 암호화 방식은 많은 약점과 문제점이 있다. 그 중 하나는 전송자와 수신자가 키를 알고있는 유일한 사람들인지를 확인하는 것이다. 만일 누군가 타인이 키를 얻어 암호화 된 메시지를 가로챈다면 이 메시지를 해석하는 것은 매우 간단한 일이다. 일반적으로 생각해서 만일 키를 안전하게 보관할 수만 있다면 이 방식은 매우 안전하다. PHP에서는 mcrypt 라이브러리를 이용해서 다양한 알고리즘을 이용하는 호스트에 접근할 수 있다.

mcrypt에서 사용되는 일반적인 암호화 방식은 다음과 같다. 보다 자세한 정보는
http://mcrypt.hellug.gr/mcrypt/mcrypt.html을 참고했다.

알고리즘
특징

DES
전통적인 DES 알고리즘으로 키의 길이가 작아 비교적 보안에 취약하다. 상수 MCRYPT_DES를 사용한다.

3DES/Triple DES
DES의 변형 판이다. 유효 키 길이는 112비트이다. 상수 MCRYPT_3DES를 사용한다.

CAST-128
캐나다에서 설계된 알고리즘으로 128비트 키와 64비트 블럭을 가진다. 상수 MCRYPT_CAST_128을 사용한다.

CAST-256
CAST-128의 확장 판으로 알고리즘으로 256비트 키와 128비트 블럭을 가진다. 상수 MCRYPT_CAST_256을 사용한다.

XTEA
128비트 키와 64비트 브럭을 가진다. 상수 MCRYPT_XTEA를 사용한다.

3-WAY
96비트 키와 블럭을 가진다. 상수 MCRYPT_THREEWAY를 사용한다.

SKIPJACK
미국 NSA에서 조건부 암호화 표준으로 설계한 알고리즘이지만 표준화되지 못했다. mcryp에서 추가 라이브러리를 이용해 접근할 수 있으며 80비트 키를 가진다. 상수 MCRYPT_SKIPJACK를 사용한다.

BLOWFISH
DES를 개선한 알고리즘으로 최대 448비트 길이의 키를 사용할 수 있다. 상수 MCRYPT_BLOWFISH를 사용한다.

TWOFISH
보안성이 높고 융통성이 있다. 128, 192, 256비트 키를 지원한다. 상수 MCRYPT_TWOFISH를 사용한다.

LOKI97
128, 192, 256비트 길이의 키를 이용한다. 상수 MCRYPT_LOKI97를 사용한다.

RC2
블럭 크기를 64비트이며 키는 8에서 1024비트이다. 오래된 알고리즘으로 16비트 컴퓨터에 적당하다. 상수 MCRYPT_RC2를 사용한다.

ARCFOUR/RC4
RC4는 RSADSL의 상표이므로 mcrypt는 RC4 알고리즘을 지원하지 않지만 ARCFOUR와 호환된다. 스트림 기반의 암호문과 최대 2048 비트 키를 지원한다. 상수 MCRYPT_ARCFOUR를 사용한다.

RIJNDAEL
가변적인 길의 블럭 암호문과 키를 가진다. 상수 MCRYPT_RIJNDAEL_128, MCRYPT_RIJNDAEL_192, MCRYPT_RIJNDAEL_256을 사용한다.

SERPENT
128비트 블럭 암호문으로 DES보다 빠르다. 상수 MCRYPT_SERPENT를 사용한다.

IDEA
64비트 블럭과 128비트 키를 사용한다. 상수 MCRYPT_IDEA를 사용한다.

ENIGMA/CRYPT
하나의 원통을 가진 암호화 기계를 기반으로 해서 보안성이 낮다. 상수 MCRYPT_CRYPT를 사용한다.

GOST
256비트 키와 64비트 블럭을 가진다. 상수 MCRYPT_GOST를 사용한다.

SAFER
64비트, 128비트 키를 지원하는 빠르고 안전한 알고리즘이다. 상수 MCRYPT_SAFER64, MCRYPT_SAFER128을 사용한다.

SAFER+
SAFER 알고리즘의 확장판으로 128, 196, 256비트 키를 지원한다. 상수 MCRYPT_SAFERPLUS를 사용한다.


예를 들어, 3DES 알고리즘을 사용하려면 다음과 같이 키를 이용해 문자열을 암호화한다:

<?php
$key = "This is our secret key";
$string = "This is ths string that we want to encrypt"; // 문자열 암호화
$encrypted_message = mcrypt_ech(MCRYPT_3DES, $key, $string, MCRYPT_ENCRYPT);
?>

이 메시지를 해독하려면 $encrypted_message를 문자열로 해서 MCRYPT_DECRYPT 상수를 이용하면 된다. 위의 코드를 mcrypt 2.2.x와 2.4.x에서 동작한다. mcrypt 2.4.x 함수가 좀더 더 유연한 기능을 제공하므로 이 함수를 사용하기를 권한다.

비대칭 암호화

비대칭 암호화(Asymmetric encryption)는 몇 년 전부터 일반인들이 사용할 수 있게 되었다. 이 방식은 상자와 자물쇠로 생각하면 이해가 쉽다. 예를 들어, 제인이 앨리스에게 보내는 비밀 메시지를 가지고 있다면 앨리스는 제인에게 열려있는 자물쇠를 보낼 수 있다. 제인은 자신의 메시지를 상자에 넣고 앨리스가 보내준 자물쇠를 이용해 상자를 잠근다.

이제 상자를 열과 메시지를 읽을 수 있는 유일한 사람은 앨리스인데 열쇠는 앨리스만이 가지고 있기 때문이다.

비대칭 암호화를 이용할 때는 자신의 공개 키(pubic key)를 보내야 한다. 이 공개 키를 열려져 있는 자물쇠라고 생각해보자. 누구든지 이 열려진 자물쇠를 이용해 여러분에게 비밀 메시지를 보낼 수 있고 개인 키(private key)는 여러분이 가지고 있으므로 이 자물쇠를 열수 있는 유일한 사람이 된다.

이 시스템은 인터넷에서 흔히 사용된다. 만일 인터넷에서 물건을 구입하거나 PGP(Pretty Good Privacy)를 사용한다면 이 시스템을 이용하는 것이다.

PHP는 OpenSSL을 이용해 이 시스템을 지원한다. 또한 OpenSSL은 CURL을 이용해 리모트 서버에 SSL(Secure Socket Layer)로 연결할 수 있다. 사용되는 세부 알고리즘은 상당히 복잡하다. 이 장의 마지막에 있는 참고 정버를 이용하면 많은 정보를 얻을 수 있다. 비대칭 암화는 다른 것보다 좀더 안전하다.

출처 : http://tong.nate.com/boxitem/post.do?action=read&_boxID=2679988&_tongID=176809&_boxItemID=31078881&_reloadTag=y