암호화 Encryption Class
암호화 클래스는 데이터를 암호화하는 두가지 방법을 제공합니다.본 클래스는 Mcrypt 라이브러리를 사용하여 암호화 하거나, 비트단위의 랜덤해쉬 XOR 인코딩방법(randomly hashed bitwise XOR encoding scheme)을 사용합니다. 만약 서버에서 Mcrypt 라이브러리 사용이 불가능하다면 인코딩된 메세지는 암호화세션이나 혹은 다른 '가벼운'목적에 적절한 수준의 보안을 제공합니다. Mcrypt 라이브러리 사용이 가능하다면 매우 높은 수준의 보안이 제공됩니다.
키 설정 Setting your Key
키란 암호화 과정을 컨트롤하고 암호화된 문자열을 다시 복호화 할수 있도록 해주는 작은 정보조각입니다. 사실, 여러분이 선택한 키는 그 키를 사용하여 암호화한 데이터를 복호화할수 있는 유일한 수단이 됩니다. 그러므로 신중히 선택하셔야함은 물론이고 , 영속적인(변하지않는) 데이터에 사용할 경우 키를 변경하지 않으셔아 합니다.
키를 잘 보호해야한다는것은 말할 필요도 없겠죠 .누군가가 여러분의 키를 손에 넣을수 있다면, 암호화된 데이터는 쉽게 해석되어버릴테니까요. 만약 서버를 여러분이 완전히 통제할수 있는 상황이 아니라면(호스팅을 받고있다든지), 키를 완전히 보호할수 있다고 보장할수 없습니다. 그러므로 , 신용카드 정보라든지 하는 매우 중요한 정보의 암호화를 하기전에 신중히 생각하셔야 합니다.
암호화 알고리즘의 장점을 최대한 활용하고자한다면 키는 영문기준으로 32글자(128비트)가 되어야하며 문자와 숫자, 대문자와 소문자가 섞인 랜덤 문자열로 하는것이 좋습니다.키를 단순한 문자열로 만들지 마세요 . 가능한한 랜덤하게 만드셔야 합니다.
키는 application/config/config.php파일에 저장 하거나 혹은 여러분 스스로 만든 저장 매커니즘을 사용하여 동적으로 암호/복호화할때만 전달하도록 할수 있습니다.
application/config/config.php파일에 저장하려면 해당파일을 여신후 아래와 같이 설정하세요 :
$config['encryption_key'] = "YOUR KEY";
메세지 길이 Message Length
인코딩 된 메시지는 원본 메세지에 비해서 약 2.6배정도 더 길어집니다.예를들어,"my super secret data" 라는 문자열은 21자인데 인코딩 되면 대략 55자가 됩니다.('대략'이라고 표현한 이유는 인코딩시 메세지의 길이는 원본에 정확히 선형적으로 비례하는것이 아니라 64비트 클러스터(64 bit clusters)에 따라 증가하기때문입니다.:we say "roughly" because the encoded string length increments in 64 bit clusters, so it's not exactly linear). 데이터 저장 메커니즘을 선택할때 이러한 사실을 염두에 두셔야합니다. 예를 들어 쿠키의 경우 4K 까지의 정보만을 저장할수 있으니까요.
클래스 초기화 Initializing the Class
다른 클래스들과 마찬가지로 , 암호화 클래스도 컨트롤러 클래스에서 $this->load->library 함수를 이용하여 초기화 합니다:
$this->load->library('encrypt');
일단 로드되면 암호화 라이브러리 객체는 $this->encrypt 를 통해 사용하실 수있습니다.
$this->encrypt->encode()
데이터 암호화를 수행하고 그 결과를 반환합니다.예:
$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);
만약 config 파일에 정의해두신 키 대신 다른 키를 사용하고자 한다면 옵션으로 두번째 파라미터를 통해 키를 전달할수 있습니다.:
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->encode($msg, $key);
$this->encrypt->decode()
암호화 된 문자열을 복호화(해독)합니다. 예:
$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);
설정파일에 있는 암호키대신 다른것을 사용하려면, 두번째 파라미터로 넘기면 됩니다.
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->decode($msg, $key);
$this->encrypt->set_cipher();
Mcrypt 해독자(cipher)를 설정할 수 있게 합니다. 기본으로MCRYPT_RIJNDAEL_256가 사용됩니다:
$this->encrypt->set_cipher(MCRYPT_BLOWFISH);
Php.net 을 방문하시면 가능한 해독자목록(available ciphers)을 확인하실 수 있습니다.
서버에서 Mcrypt가 지원되는지 확인하고싶다면 아래의 코드를 사용하세요:
echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';
$this->encrypt->set_mode();
Mcrypt 모드를 설정합니다. 기본으로 MCRYPT_MODE_CBC가 사용됩니다. 예:
$this->encrypt->set_mode(MCRYPT_MODE_CFB);
Php.net 에서 사용가능한 모드목록( available modes)을 확인하실 수 있습니다.
$this->encrypt->sha1();
SHA1 인코딩 함수 입니다. 문자열을 넘겨주면 160 비트의 단방향 해쉬를 리턴합니다. 참고: SHA1은 MD5에서처럼 복호화(decode) 불가능합니다. 예:
$hash = $this->encrypt->sha1('Some string');
대부분의 경우 PHP는 SHA1을 기본으로 제공합니다. 만약 해쉬를 인코딩하는것만 필요하다면 php에서 기본제공하는 함수를 사용하는것이 좀더 간단합니다.:
$hash = sha1('Some string');
만약 서버에서 SHA1를 지원하지않는다면 위에서 제공하는 함수를 사용하시면됩니다.
$this->encrypt->encode_from_legacy($orig_data, $legacy_mode = MCRYPT_MODE_ECB, $key = '');
CodeIgniter 1.x에서 암호화된 데이터를 CodeIgniter 2.x 암호화 클래스와 호환성을 갖도록 다시 인코딩 합니다.파일이나 데이터베이스등에 인코딩된 데이터가 저장된경우, 서버에서 Mcrypt를 지원한다면 이 메서드를 사용할 수 있습니다. 인코딩된 세션이나 임시 데이터등의 경우에 있어서는 개발자가 손댈 부분이 없습니다.하지만,2.x 이전버전에서 인코딩 된 데이터는 디코딩 되지않기 때문에 세션은 제거됩니다.
왜 구버전의 인코딩, 디코딩을 유지하지 않고 다시 인코딩하는 메서드만 제공하는가? 암호화 클래스의 알고리즘은 CodeIgniter 2.x에서 성능과 안전성 모두 향상되었습니다. 그래서, 이전 방법을 사용하지 않는것이 좋다고 생각했습니다. 암호화 라이브러리를 확장하여 이전버전으로 동작하게 할 수 있겠지만, 신중하게 생각하시기 바랍니다.
$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
Parameter | Default | Description |
---|---|---|
$orig_data | 없음 | CodeIgniter 1.x 암호화 클래스에서 암호화된 데이터 |
$legacy_mode | MCRYPT_MODE_ECB | 원래 데이터를 암호화하는 데 사용된 Mcrypt 모드. CodeIgniter 1.x의 기본값은 MCRYPT_MODE_ECB이었으며, 별도로 지정하지않으면 이 값이 사용됩니다. |
$key | 없음 | 암호화 키. 먼저 설명한 것처럼 일반적으로 설정 파일에 지정된 것. |