[PHP] 암복호화 함수 md5와 base64


Development note/PHP  2019. 11. 13. 09:00

안녕하세요. 명월입니다.


이 글은 PHP에서 암복호화 함수 md5와 base64에 대한 글입니다.


우리가 프로그램을 하면 데이터를 암복호화할 때가 있습니다. 특히 패스워드를 다룰 때 많이 사용됩니다.

md5

링크 - https://www.php.net/manual/en/function.md5.php

md5는 복호화가 불가능한 암호화 알고리즘입니다. 즉, 암호화를 하면 다시 원래 값으로 돌아오지 못하는 암호화 알고리즘입니다.

md5는 보통 패스워드를 암호화할 때 사용되는데, 유저로부터 패스워드를 받고 암호화를 해서 데이터베이스에 넣으면 다음에 로그인할 때 암호화된 문자열끼리 비교를 하는 것으로 암호의 일치 여부를 판단합니다.

사용하는 방법은 PHP에서는 md5함수를 사용하는 것으로 간단하게 사용 가능합니다.

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // md5로 암호화한다.
    $password = md5($_POST["ps"]);
    var_dump($password);
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>
  <form method="POST">
    <input type="password" name="ps"><br />
    <label id="viewer"></label><br />
    <input type="submit">
  </form>
  <script>
    // password 입력란은 보이지가 않으니 label로 임시로 보이게 끔 표시하였습니다.
    $("input[type=password]").on("keyup",function(){
      $("label#viewer").html($(this).val());
    });
  </script>
</body>
</html>

위 예제를 보면 암호화가 되었습니다. 제가 예제로 testpassword라고 입력했는데, testpassword의 값은 항상 e16b2ab8d12314bf4efbd6203906ea6c의 값이 나오기 때문에 패스워드 확인할 때는 암호화된 값으로 비교를 하면 인증을 할 수 있습니다.

base64

base64도 md5와 같은 암복호화 알고리즘이기는 합니다만 md5와 다르게 암복호화가 가능한 알고리즘입니다.

base64는 패스워드등이나 암호등을 암호등을 암복호화를 하는 것이 아니라 byte등의 데이터를 string형식으로 나타내기 위해 사용하는 암복호화 알고리즘입니다.

(이게 사실 용도가 전혀 다른 알고리즘인데, 영어에서 표기법이 오다보니 한국어로는 전부 암복화라고 표현이 되네요...)

링크 - https://www.php.net/manual/ja/function.base64-encode.php

링크 - https://www.php.net/manual/ja/function.base64-decode.php


base64도 기본적으로 php에서 내장 함수를 제공하기 때문에 어렵지 않게 사용 가능합니다.

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // base64 인코딩한다.
    $password = base64_encode ($_POST["ps"]);
    var_dump($password);
    // base64 디코딩한다.
    $password = base64_decode ($password);
    var_dump($password);
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>
  <form method="POST">
    <input type="password" name="ps"><br />
    <label id="viewer"></label><br />
    <input type="submit">
  </form>
  <script>
    // password 입력란은 보이지가 않으니 label로 임시로 보이게 끔 표시하였습니다.
    $("input[type=password]").on("keyup",function(){
      $("label#viewer").html($(this).val());
    });
  </script>
</body>
</html>

위 예제를 보면 md5와 같이 패스워드를 받고 base64로 인코딩을 하고 화면에 표시하고 다시 디코딩하고 표시하게 작성하였습니다.

결과처럼 인코딩을 할 때는 암호화같은 문자열로 바뀌지만, 다시 디코딩을 하면 원래의 값으로 돌아오는 것을 확인할 수 있습니다.

<?php
  try{
    if(@$handle = fopen('nowonbuntistory.png', 'r')) {
      $contents = fread($handle, filesize('nowonbuntistory.png'));
    }
  } catch(Exception $e){
    print_r($e);
  } finally{
    @fclose($handle);
  }
  // 이미지 파일을 base64 인코딩했다. 그리고 앞에 데이터 타입을 넣어서 inlined image 타입으로 바꾸었다.
  $base64 = "data:image/png;base64,".base64_encode($contents);
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>
  <img src="<?=$base64?>" style="width:200px;height:200px;">
</body>
</html>

위 예제는 이미지를 읽어와서 base64로 인코딩해서 브라우져에서 보이도록 설정했습니다.


여기까지 PHP에서 암복호화 함수 md5와 base64에 관한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.