PHP 생성자 오버로딩

PHP에서는 기본적으로 생성자 오버로딩이 되지 않는다.
다른 방법으로는 func_get_args()를 이용한 방법과 팩토리 패턴을 이용한 방법이 있는데,
func_get_args()를 이용하게 되면 인수를 검사기 위해 코드가 지저분해 질 수 있다.
때문에 팩토리 패턴을 이용하는 방법을 추천한다.

팩토리 패턴을 이용

class Poo
{
    protected $name;
    public function __construct()
    {
    }

    public static function withName($name)
    {
        $instance = new self();
        $instance->setName($name);
        return $instance;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

$poo = Poo::withName('홍길동');

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