암호화 라이브러리¶
중요
사용자 비밀번호 저장에 이 라이브러리나 다른 암호화 라이브러리를 사용하지 마세요! 비밀번호는 해시해야 하며, PHP의 자체 Password Hashing extension을 사용해야 합니다.
암호화 라이브러리는 양방향 데이터 암호화를 제공합니다. 암호화적으로 안전한 방식으로 수행하기 위해 불행히도 모든 시스템에서 항상 사용 가능하지는 않은 PHP 확장을 활용합니다. 이 라이브러리를 사용하려면 다음 의존성 중 하나를 충족해야 합니다:
위 의존성 중 어느 것도 충족되지 않으면 적절한 암호화에 필요한 높은 기준을 충족하는 충분히 좋은 구현을 제공할 수 없습니다.
암호화 라이브러리 사용¶
클래스 초기화¶
CodeIgniter의 대부분의 다른 클래스와 마찬가지로, 암호화 라이브러리는
$this->load->library() 메소드를 사용하여 컨트롤러에서 초기화됩니다:
$this->load->library('encryption');
로드되면 다음을 사용하여 암호화 라이브러리 오브젝트에 접근할 수 있습니다:
$this->encryption
기본 동작¶
기본적으로 암호화 라이브러리는 설정된 encryption_key와 SHA512 HMAC 인증을 사용하여 CBC 모드의 AES-128 암호를 사용합니다.
참고
AES-128은 강력한 것으로 입증되었고 다양한 암호화 소프트웨어와 프로그래밍 언어의 API에서 널리 사용 가능하기 때문에 선택되었습니다.
그러나 encryption_key는 그대로 사용되지 않습니다.
암호화에 어느 정도 익숙하다면 HMAC도 비밀 키가 필요하며, 암호화와 인증에 동일한 키를 사용하는 것은 나쁜 관행임을 이미 알고 있을 것입니다.
이 때문에 이미 설정된 encryption_key에서 두 개의 별도 키가 파생됩니다: 하나는 암호화용, 하나는 인증용입니다. 이것은 HMAC 기반 키 유도 함수 (HKDF)라는 기술을 통해 수행됩니다.
encryption_key 설정¶
암호화 키는 암호화 프로세스를 제어하여 일반 텍스트 문자열을 암호화하고 나중에 복호화할 수 있도록 하는 정보입니다. 이것은 공개의 눈에서 숨기기로 결정한 데이터를 복호화할 수 있는 유일한 사람이 될 수 있도록 하는 전체 프로세스의 비밀 “재료”입니다. 하나의 키가 데이터를 암호화하는 데 사용되면, 동일한 키가 복호화할 수 있는 유일한 수단을 제공합니다. 따라서 신중하게 선택해야 할 뿐만 아니라, 분실하면 데이터에 대한 접근도 잃게 됩니다.
최대 보안을 보장하기 위해 이러한 키는 가능한 한 강력해야 할 뿐만 아니라 자주 변경되어야 합니다. 그러나 이러한 동작은 구현하기가 거의 실용적이지 않거나 불가능하며, 그것이 바로 CodeIgniter가 (거의) 매번 사용할 단일 키를 설정할 수 있는 기능을 제공하는 이유입니다.
키를 신중하게 보호해야 합니다. 누군가가 키에 접근하면 데이터가 쉽게 복호화됩니다. 서버가 완전히 제어되지 않는 경우 키 보안을 보장하기 불가능하므로 신용카드 번호 저장과 같이 높은 보안이 필요한 항목에 사용하기 전에 신중하게 생각해야 합니다.
암호화 키는 사용 중인 암호화 알고리즘이 허용하는 만큼 반드시 길어야 합니다. AES-128의 경우 128비트 또는 16바이트(문자)입니다. 다른 암호의 지원 키 길이를 보여주는 아래 표를 참조하세요.
키는 가능한 한 무작위여야 하며 일반 텍스트 문자열이나 해싱 함수의 출력 등이어서는
안 됩니다. 적절한 키를 만들려면 암호화 라이브러리의 create_key() 메소드를
사용해야 합니다:
// $key에는 16바이트 (128비트) 무작위 키가 할당됩니다
$key = $this->encryption->create_key(16);
키는 application/config/config.php에 저장하거나, 자체 저장 메커니즘을 설계하여 암호화/복호화 시 키를 동적으로 전달할 수 있습니다.
application/config/config.php에 키를 저장하려면 파일을 열고 다음을 설정하세요:
$config['encryption_key'] = 'YOUR KEY';
create_key() 메소드는 이진 데이터를 출력하므로 다루기 어렵습니다(즉, 복사-붙여넣기가
손상될 수 있음). 따라서 bin2hex(), hex2bin() 또는 Base64 인코딩을 사용하여
키를 더 친숙한 방식으로 작업할 수 있습니다. 예시:
// 키의 hex 인코딩된 표현을 가져옵니다:
$key = bin2hex($this->encryption->create_key(16));
// hex2bin()을 사용하여 동일한 값을 설정에 넣어
// 라이브러리에 이진수로 전달되도록 합니다:
$config['encryption_key'] = hex2bin(<your hex-encoded key>);
지원되는 암호화 알고리즘 및 모드¶
참고
‘암호’와 ‘암호화 알고리즘’이라는 용어는 상호 교환 가능합니다.
이식 가능한 암호¶
MCrypt와 OpenSSL(이 문서에서 드라이버라고도 함)은 각각 다른 암호화 알고리즘 세트를 지원하며 종종 다른 방식으로 구현합니다. 암호화 라이브러리는 이식 가능한 방식으로 사용하도록 설계되었습니다. 즉, 적어도 두 드라이버가 모두 지원하는 암호에 대해서는 상호 교환적으로 사용할 수 있습니다.
또한 다른 프로그래밍 언어 및 라이브러리의 표준 구현과 일치하도록 구현되었습니다.
다음은 소위 “이식 가능한” 암호 목록입니다. “CodeIgniter 이름”은 해당 암호를 사용하기 위해 암호화 라이브러리에 전달해야 하는 문자열 값입니다:
암호 이름 |
CodeIgniter 이름 |
키 길이 (비트 / 바이트) |
지원 모드 |
|---|---|---|---|
AES-128 / Rijndael-128 |
aes-128 |
128 / 16 |
CBC, CTR, CFB, CFB8, OFB, ECB |
AES-192 |
aes-192 |
192 / 24 |
CBC, CTR, CFB, CFB8, OFB, ECB |
AES-256 |
aes-256 |
256 / 32 |
CBC, CTR, CFB, CFB8, OFB, ECB |
DES |
des |
56 / 7 |
CBC, CFB, CFB8, OFB, ECB |
TripleDES |
tripledes |
56 / 7, 112 / 14, 168 / 21 |
CBC, CFB, CFB8, OFB |
Blowfish |
blowfish |
128-448 / 16-56 |
CBC, CFB, OFB, ECB |
CAST5 / CAST-128 |
cast5 |
88-128 / 11-16 |
CBC, CFB, OFB, ECB |
RC4 / ARCFour |
rc4 |
40-2048 / 5-256 |
Stream |
중요
MCrypt의 작동 방식으로 인해 적절한 길이의 키를 제공하지 않으면 설정된 것과 다른 알고리즘을 사용하게 될 수 있으므로 주의하세요!
참고
위 표에서 명확하지 않은 경우, Blowfish, CAST5 및 RC4는 가변 길이 키를 지원합니다. 즉, 표시된 범위의 모든 숫자가 유효하지만, 비트 단위로는 8비트 증분으로만 발생합니다.
참고
CAST5가 128비트(16바이트) 미만의 키 길이를 지원하지만, 실제로는 RFC 2144에 지정된 대로 최대 길이로 제로 패딩됩니다.
참고
Blowfish는 32비트(4바이트)만큼 작은 키 길이를 지원하지만, 테스트에서 128비트(16바이트) 이상의 길이만 MCrypt와 OpenSSL 모두에서 제대로 지원됨을 확인했습니다. 또한 이렇게 짧은 키를 사용하는 것은 어쨌든 나쁜 관행입니다.
드라이버별 암호¶
위에서 언급한 바와 같이, MCrypt와 OpenSSL은 다른 암호화 알고리즘 세트를 지원합니다. 이식성을 위해, 그리고 제대로 테스트하지 않았기 때문에 드라이버별 암호를 사용하지 않는 것을 권장하지만, 다음은 그 대부분의 목록입니다:
암호 이름 |
드라이버 |
키 길이 (비트 / 바이트) |
지원 모드 |
|---|---|---|---|
AES-128 |
OpenSSL |
128 / 16 |
CBC, CTR, CFB, CFB8, OFB, ECB, XTS |
AES-192 |
OpenSSL |
192 / 24 |
CBC, CTR, CFB, CFB8, OFB, ECB, XTS |
AES-256 |
OpenSSL |
256 / 32 |
CBC, CTR, CFB, CFB8, OFB, ECB, XTS |
Rijndael-128 |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
Rijndael-192 |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
Rijndael-256 |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
GOST |
MCrypt |
256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
Twofish |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
CAST-128 |
MCrypt |
40-128 / 5-16 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
CAST-256 |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
Loki97 |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
SaferPlus |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
Serpent |
MCrypt |
128 / 16, 192 / 24, 256 / 32 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
XTEA |
MCrypt |
128 / 16 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
RC2 |
MCrypt |
8-1024 / 1-128 |
CBC, CTR, CFB, CFB8, OFB, OFB8, ECB |
RC2 |
OpenSSL |
8-1024 / 1-128 |
CBC, CFB, OFB, ECB |
Camellia-128 |
OpenSSL |
128 / 16 |
CBC, CFB, CFB8, OFB, ECB |
Camellia-192 |
OpenSSL |
192 / 24 |
CBC, CFB, CFB8, OFB, ECB |
Camellia-256 |
OpenSSL |
256 / 32 |
CBC, CFB, CFB8, OFB, ECB |
Seed |
OpenSSL |
128 / 16 |
CBC, CFB, OFB, ECB |
참고
이러한 암호 중 하나를 사용하려면 암호화 라이브러리에 소문자로 이름을 전달해야 합니다.
참고
모든 AES 암호(및 Rijndael-128)도 이식 가능한 암호 목록에 있음을 알아챘을 것입니다. 이는 드라이버가 이러한 암호에 대해 다른 모드를 지원하기 때문입니다. 또한 AES-128과 Rijndael-128은 실제로 동일한 암호이지만 128비트 키와 함께 사용할 때만 해당됩니다.
참고
CAST-128 / CAST-5는 이식 가능한 암호와 드라이버별 암호 목록 모두에 있습니다. OpenSSL의 구현이 80비트 이하의 키 크기에서 올바르게 작동하지 않는 것으로 보이기 때문입니다.
참고
RC2는 MCrypt와 OpenSSL 모두 지원한다고 나열되어 있습니다. 그러나 두 드라이버는 다르게 구현하여 이식 가능하지 않습니다. 이를 제대로 구현하지 않는 것이 MCrypt임을 확인하는 불명확한 출처를 하나 발견했습니다.
암호화 모드¶
다른 암호화 모드는 다른 특성을 가지며 다른 목적으로 사용됩니다. 일부는 다른 것보다 강력하고, 일부는 더 빠르며, 일부는 추가 기능을 제공합니다. 이 부분에 대한 심층적인 내용은 암호화 전문가에게 맡깁니다. 아래 표는 경험 있는 사용자에게 간략한 정보를 제공하기 위한 것입니다. 초보자라면 CBC 모드를 사용하세요 - 일반적인 목적으로 강력하고 안전한 것으로 널리 인정됩니다.
모드 이름 |
CodeIgniter 이름 |
드라이버 지원 |
추가 정보 |
|---|---|---|---|
CBC |
cbc |
MCrypt, OpenSSL |
안전한 기본 선택 |
CTR |
ctr |
MCrypt, OpenSSL |
이론적으로 CBC보다 낫다고 여겨지지만 널리 사용 가능하지 않음 |
CFB |
cfb |
MCrypt, OpenSSL |
해당 없음 |
CFB8 |
cfb8 |
MCrypt, OpenSSL |
CFB와 동일하지만 8비트 모드로 작동 (권장하지 않음). |
OFB |
ofb |
MCrypt, OpenSSL |
해당 없음 |
OFB8 |
ofb8 |
MCrypt |
OFB와 동일하지만 8비트 모드로 작동 (권장하지 않음). |
ECB |
ecb |
MCrypt, OpenSSL |
IV를 무시함 (권장하지 않음). |
XTS |
xts |
OpenSSL |
일반적으로 RAM이나 하드디스크 저장소와 같은 랜덤 액세스 데이터 암호화에 사용됨. |
Stream |
stream |
MCrypt, OpenSSL |
실제로 모드가 아니라 스트림 암호가 사용됨을 나타냄. 일반 암호+모드 초기화 프로세스 때문에 필요함. |
메시지 길이¶
암호화된 문자열은 일반적으로 원본 일반 텍스트 문자열보다 더 길다는 것을 아는 것이 중요합니다(암호화 알고리즘에 따라 다름).
이는 암호화 알고리즘 자체, 암호문 앞에 붙는 IV, 그리고 앞에 붙는 HMAC 인증 메시지의 영향을 받습니다. 또한 암호화된 메시지는 사용 중인 문자 세트에 관계없이 저장 및 전송에 안전하도록 Base64로 인코딩됩니다.
데이터 저장 메커니즘을 선택할 때 이 정보를 염두에 두세요. 예를 들어 쿠키는 4K의 정보만 저장할 수 있습니다.
라이브러리 설정¶
사용성, 성능, 그리고 이전의 Encrypt Class와 관련된 역사적 이유로 암호화 라이브러리는 동일한 드라이버, 암호화 알고리즘, 모드 및 키를 반복적으로 사용하도록 설계되었습니다.
위의 “기본 동작” 섹션에서 언급한 바와 같이, 이는 자동 감지된 드라이버(OpenSSL이
더 높은 우선순위), CBC 모드의 AES-128 암호, 그리고 $config['encryption_key']
값을 사용함을 의미합니다.
그러나 이를 변경하려면 initialize() 메소드를 사용해야 합니다. 모두 선택적인
매개변수의 연관 배열을 허용합니다:
옵션 |
가능한 값 |
|---|---|
driver |
‘mcrypt’, ‘openssl’ |
cipher |
암호 이름 (지원되는 암호화 알고리즘 및 모드 참조) |
mode |
암호화 모드 (암호화 모드 참조) |
key |
암호화 키 |
예를 들어 암호화 알고리즘과 모드를 CTR 모드의 AES-256으로 변경하려면:
$this->encryption->initialize(
array(
'cipher' => 'aes-256',
'mode' => 'ctr',
'key' => '<a 32-character random string>'
)
);
암호와 모드만 변경하려고 했지만 예시에 키도 포함했습니다. 이전에 언급했듯이 사용된 알고리즘에 적합한 크기의 키를 선택하는 것이 중요합니다.
어떤 이유로 두 드라이버를 모두 사용할 수 있지만 OpenSSL 대신 MCrypt를 사용하려면 드라이버를 변경하는 기능도 있습니다:
// MCrypt 드라이버로 전환
$this->encryption->initialize(array('driver' => 'mcrypt'));
// OpenSSL 드라이버로 다시 전환
$this->encryption->initialize(array('driver' => 'openssl'));
데이터 암호화 및 복호화¶
이미 설정된 라이브러리 설정으로 데이터를 암호화하고 복호화하는 것은 간단합니다.
encrypt() 및/또는 decrypt() 메소드에 문자열을 전달하기만 하면 됩니다:
$plain_text = 'This is a plain-text message!';
$ciphertext = $this->encryption->encrypt($plain_text);
// 출력: This is a plain-text message!
echo $this->encryption->decrypt($ciphertext);
그게 전부입니다! 암호화 라이브러리는 전체 프로세스가 기본적으로 암호학적으로 안전하도록 필요한 모든 것을 처리합니다. 걱정할 필요가 없습니다.
중요
오류가 발생하면 두 메소드 모두 FALSE를 반환합니다. encrypt()의
경우 이것은 잘못된 설정만을 의미할 수 있지만, 프로덕션 코드에서는 항상
decrypt()의 반환 값을 확인해야 합니다.
작동 방식¶
프로세스가 어떻게 작동하는지 알아야 한다면, 내부에서 일어나는 일을 설명합니다:
$this->encryption->encrypt($plain_text)SHA-512 다이제스트 알고리즘을 사용하여 HKDF를 통해 설정된 encryption_key에서 암호화 키와 HMAC 키를 파생합니다.
무작위 초기화 벡터(IV)를 생성합니다.
위에서 언급한 파생된 암호화 키와 IV를 사용하여 CBC 모드의 AES-128(또는 이전에 설정된 다른 암호와 모드)을 통해 데이터를 암호화합니다.
해당 IV를 결과 암호문 앞에 추가합니다.
문자 세트에 대한 걱정 없이 안전하게 저장하거나 전송할 수 있도록 결과 문자열을 Base64로 인코딩합니다.
데이터 무결성을 보장하기 위해 파생된 HMAC 키를 사용하여 SHA-512 HMAC 인증 메시지를 만들고 Base64 문자열 앞에 추가합니다.
$this->encryption->decrypt($ciphertext)SHA-512 다이제스트 알고리즘을 사용하여 HKDF를 통해 설정된 encryption_key에서 암호화 키와 HMAC 키를 파생합니다. 설정된 encryption_key가 동일하므로
encrypt()메소드에서와 동일한 결과를 생성합니다. 그렇지 않으면 복호화할 수 없습니다.문자열이 충분히 긴지 확인하고, HMAC을 분리하여 올바른지 검증합니다(타이밍 공격을 방지하는 방식으로 수행됨). 확인 중 하나라도 실패하면 FALSE를 반환합니다.
문자열을 Base64 디코딩합니다.
암호문에서 IV를 분리하고 해당 IV와 파생된 암호화 키를 사용하여 암호문을 복호화합니다.
커스텀 매개변수 사용¶
제어할 수 없는 다른 시스템과 상호 작용해야 하고 데이터를 다른 방법으로 암호화하는 경우가 있습니다. 위에서 설명한 순서와 일치하지 않고 아마도 모든 단계를 사용하지도 않는 방법입니다.
암호화 라이브러리를 사용하면 암호화 및 복호화 프로세스 작동 방식을 변경할 수 있어 이러한 상황에 맞는 커스텀 솔루션을 쉽게 맞춤화할 수 있습니다.
참고
이 방법으로 라이브러리를 사용하는 것은 설정 파일에 encryption_key를 설정하지 않고도 가능합니다.
encrypt() 또는 decrypt() 메소드에 몇 가지 매개변수가 있는 연관 배열을
전달하기만 하면 됩니다. 예시:
// 외부 소스에서 $ciphertext, $key, $hmac_key가 있다고 가정합니다
$message = $this->encryption->decrypt(
$ciphertext,
array(
'cipher' => 'blowfish',
'mode' => 'cbc',
'key' => $key,
'hmac_digest' => 'sha256',
'hmac_key' => $hmac_key
)
);
위 예시에서 CBC 모드의 Blowfish 암호를 사용하여 암호화하고 SHA-256 HMAC으로 인증된 메시지를 복호화합니다.
중요
이 예시에서 ‘key’와 ‘hmac_key’ 모두 사용됩니다. 커스텀 매개변수를 사용할 때 암호화 및 HMAC 키는 라이브러리의 기본 동작처럼 파생되지 않습니다.
다음은 사용 가능한 옵션 목록입니다.
그러나 정말로 필요하고 무엇을 하는지 아는 경우가 아니라면 암호화 프로세스를 변경하지 않는 것을 권장합니다. 이것이 보안에 영향을 미칠 수 있으므로 주의해서 사용하세요.
옵션 |
기본값 |
필수 / 선택 |
설명 |
|---|---|---|---|
cipher |
해당 없음 |
필수 |
암호화 알고리즘 (지원되는 암호화 알고리즘 및 모드 참조). |
mode |
해당 없음 |
필수 |
암호화 모드 (암호화 모드 참조). |
key |
해당 없음 |
필수 |
암호화 키. |
hmac |
TRUE |
선택 |
HMAC 사용 여부. 불리언. FALSE로 설정하면 hmac_digest와 hmac_key가 무시됩니다. |
hmac_digest |
sha512 |
선택 |
HMAC 메시지 다이제스트 알고리즘 (지원되는 HMAC 인증 알고리즘 참조). |
hmac_key |
해당 없음 |
필수 (hmac이 FALSE가 아닌 |
경우) HMAC 키. |
raw_data |
FALSE |
선택 |
암호문이 원시여야 하는지 여부. 불리언. TRUE로 설정하면 Base64 인코딩 및 디코딩이 수행되지 않고 HMAC이 16진수 문자열이 아닙니다. |
중요
필수 매개변수가 제공되지 않거나 제공된 값이 올바르지 않으면
encrypt()와 decrypt()는 FALSE를 반환합니다. hmac이 FALSE로
설정되지 않는 한 hmac_key도 이에 해당합니다.
지원되는 HMAC 인증 알고리즘¶
HMAC 메시지 인증을 위해 암호화 라이브러리는 SHA-2 계열 알고리즘 사용을 지원합니다:
알고리즘 |
원시 길이 (바이트) |
Hex 인코딩 길이 (바이트) |
|---|---|---|
sha512 |
64 |
128 |
sha384 |
48 |
96 |
sha256 |
32 |
64 |
sha224 |
28 |
56 |
MD5 또는 SHA1과 같은 다른 인기 있는 알고리즘을 포함하지 않는 이유는 더 이상 충분히 안전하다고 여겨지지 않기 때문입니다. 꼭 사용해야 하는 경우 PHP의 기본 hash_hmac() 함수를 통해 쉽게 사용할 수 있습니다.
더 강력한 알고리즘은 물론 나타나고 널리 사용 가능해지면 나중에 추가될 것입니다.
클래스 레퍼런스¶
- class CI_Encryption¶
- initialize($params)¶
- 매개변수:
$params (
array) – 설정 매개변수
- 반환:
CI_Encryption 인스턴스 (메소드 체이닝)
- 반환 형식:
다른 드라이버, 암호, 모드 또는 키를 사용하도록 라이브러리를 초기화(설정)합니다.
예시:
$this->encryption->initialize( array('mode' => 'ctr') );
자세한 내용은 라이브러리 설정 섹션을 참조하세요.
- encrypt($data[, $params = NULL])¶
- 매개변수:
$data (
string) – 암호화할 데이터$params (
array) – 선택적 매개변수
- 반환:
암호화된 데이터 또는 실패 시 FALSE
- 반환 형식:
string
입력 데이터를 암호화하고 암호문을 반환합니다.
예시:
$ciphertext = $this->encryption->encrypt('My secret message');
선택적 매개변수에 대한 정보는 커스텀 매개변수 사용 섹션을 참조하세요.
- decrypt($data[, $params = NULL])¶
- 매개변수:
$data (
string) – 복호화할 데이터$params (
array) – 선택적 매개변수
- 반환:
복호화된 데이터 또는 실패 시 FALSE
- 반환 형식:
string
입력 데이터를 복호화하고 일반 텍스트로 반환합니다.
예시:
echo $this->encryption->decrypt($ciphertext);
선택적 매개변수에 대한 정보는 커스텀 매개변수 사용 섹션을 참조하세요.
- create_key($length)¶
- 매개변수:
$length (
int) – 출력 길이
- 반환:
지정된 길이의 의사 무작위 암호화 키 또는 실패 시 FALSE
- 반환 형식:
string
운영 체제 소스(예: /dev/urandom)에서 무작위 데이터를 가져와 암호화 키를 만듭니다.
- hkdf($key[, $digest = 'sha512'[, $salt = NULL[, $length = NULL[, $info = '']]]])¶
- 매개변수:
$key (
string) – 입력 키 재료$digest (
string) – SHA-2 계열 다이제스트 알고리즘$salt (
string) – 선택적 salt$length (
int) – 선택적 출력 길이$info (
string) – 선택적 컨텍스트/애플리케이션별 정보
- 반환:
의사 무작위 키 또는 실패 시 FALSE
- 반환 형식:
string
다른 (아마도 더 약한) 키에서 키를 파생합니다.
이 메소드는 설정된 encryption_key에서 암호화 및 HMAC 키를 파생하기 위해 내부적으로 사용됩니다.
일반적인 목적으로 공개적으로 사용 가능합니다. RFC 5869에 설명되어 있습니다.
그러나 RFC 5869의 설명과 달리, 이 구현은 SHA1을 지원하지 않습니다.
예시:
$hmac_key = $this->encryption->hkdf( $key, 'sha512', NULL, NULL, 'authentication' ); // $hmac_key는 64바이트 길이의 의사 무작위 키입니다