[PHP] 문자열 AES-256-CBC 암복호화

개발 작업을 진행하다보면 보안을 위해 문자열을 암호화해서 보관하고 필요 때 복호화해서 사용하는 경우가 많다. 비밀번호 같은 경우는 복호화가 불가능하도록 암호화를 하지만 다른 서비스의 로그인 정보 등은 서비스 접근 때 사용되어야 하기 때문에 복호화할 수 있어야 한다. 그럴 때 사용할 수 있는 AES-256-CBC 암복호화 함수를 간단하게 만들었다. PHP openssl 확장을 이용하는 것으로 해당 모듈이 설치되어 있지 않다면 사용이 불가능 하다.

데모 : http://demo.ncube.net/aes256.php

<?php
define('SALT', 'zvJc5@77+uC!5#F*dGMysvjRGP7M25G$F6!VzF=y');

function AESEncrypt($str, $key = '')
{
    if (!$key)
        $key = SALT;

    return base64_encode(openssl_encrypt($str, "AES-256-CBC", $key, true, str_repeat(chr(0), 16)));
}

function AESDecrypt($str, $key = '')
{
    if (!$key)
        $key = SALT;

    return openssl_decrypt(base64_decode($str), "AES-256-CBC", $key, true, str_repeat(chr(0), 16));
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AES 암복화 Demo</title>
</head>
<body>
    <form name="faes" method="get">
    <p>
        <label for="word">단어</label>
        <input type="text" name="word" id="word" maxlength="50">
    </p>
    <p>
        <input type="submit" value="암호화">
    </p>
    </form>

    <?php if (isset($_GET['word']) && $_GET['word']) { ?>
    <p>
        암호화 문자열 : <?php echo $str = AESEncrypt($_GET['word']); ?>
    </p>

    <form name="faes" method="get">
    <p>
        <label for="str">암호화 문자열</label>
        <input type="text" name="str" id="str" value="<?php echo $str; ?>">
    </p>
    <p>
        <input type="submit" value="복호화">
    </p>
    </form>
    <?php } ?>

    <?php if (isset($_GET['str']) && $_GET['str']) { ?>
    <p>
        복호화 단어 : <?php echo AESDecrypt($_GET['str']); ?>
    </p>
    <?php } ?>
</body>
</html>

위 코드에서 상수 SALT 값은 외부에 노출되어선 안된다. 암호화된 데이터를 복호화할 수 있기 때문이다.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.