php에서 암호화 mcrypt_encrypt를 사용하지 말고 Libsodium 또는 openssl_encrypt를 사용.

mcrypt_encrypt를 사용하여 암호화 할 때, pkcs7 패딩 처리를 안해주면, openssl_decrypt나, 다른 언어 복호화에서 복호화가 불가능하다.

때문에 되도록 사용을 자제하고, 만약에 레거시 시스템에서 사용하게 되면, pkcs7 처리를 해줘야한다.

https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B0%9C_%ED%82%A4_%EC%95%94%ED%98%B8_%ED%91%9C%EC%A4%80

예제 소스

<?php
function pkcs7_pad($str)
{
    $len = mb_strlen($str, '8bit');
    $c = 16 - ($len % 16);
    $str .= str_repeat(chr($c), $c);
    return $str;
}

$message = 'test';
$key = openssl_random_pseudo_bytes(16);
$iv = openssl_random_pseudo_bytes(16);

$cipher = mcrypt_encrypt(
    MCRYPT_RIJNDAEL_128,
    $key,
    pkcs7_pad($message),
    MCRYPT_MODE_CBC,
    $iv
);

$plain = openssl_decrypt(
    $cipher,
    'aes-128-cbc',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);

var_dump(
    $message,
    bin2hex($cipher),
    $plain,
    mb_strlen($message, '8bit'),
    mb_strlen($plain, '8bit'),
    $message === $plain
);
?>

https://3v4l.org/bdQe9

mcrypt_encrypt를 사용하면 안되는 이유

https://paragonie.com/blog/2015/05/if-you-re-typing-word-mcrypt-into-your-code-you-re-doing-it-wrong

mcrypt_encrypt 대안

  • Use Libsodium – A PHP extension (PHP7.2 부터는 기본적으로 들어가있음.)
  • If you can’t use Libsodium, use defuse/php-encryption – Straight PHP code
  • If you can’t use Libsodium or defuse/php-encryption, use OpenSSL – A lot of servers will already have this installed. If not, it can be compiled with –with-openssl[=DIR]

https://stackoverflow.com/questions/41272257/php-7-mcrypt-deprecated-need-alternative
https://paragonie.com/white-paper/2015-secure-php-data-encryption

댓글 남기기