ServBay에서 Sodium PHP 확장 사용 방법
ServBay는 강력한 로컬 웹 개발 통합 환경으로, Sodium PHP 확장 기능을 미리 설치하고 기본적으로 활성화합니다. Sodium은 현대적이고 사용하기 쉬운 암호화 라이브러리로, 데이터 암호화와 보안 통신에 널리 활용됩니다. ServBay를 이용하면 별도의 컴파일이나 추가 설정 없이 PHP 애플리케이션에서 Sodium 확장 기능을 직접 사용하여 데이터의 안전한 암호화와 복호화를 쉽게 구현할 수 있습니다.
Sodium 확장 소개
Sodium(libsodium)은 단순하면서도 안전한 암호화 기능 제공을 목적으로 설계된 현대적인 암호화 라이브러리입니다. 다양한 암호화 알고리즘과 기능(대칭 암호, 비대칭 암호, 디지털 서명, 해시 계산, 키 교환 등)을 지원합니다. PHP 7.2부터는 Sodium 라이브러리가 핵심 확장으로 PHP에 통합되었으며, 이는 더 이상 지원되지 않는 mcrypt 라이브러리를 대체하는 현대적이고 안전한 솔루션입니다.
주요 특징
- 사용이 간편함: 직관적인 API로 데이터 암호화와 복호화가 쉽습니다.
- 강력한 보안성: 최신 암호화 알고리즘과 베스트 프랙티스를 적용하여 데이터의 안전을 보장합니다.
- 다양한 기능: 대칭·비대칭 암호, 디지털 서명, 해시, 키 교환 등 폭넓게 지원합니다.
- 크로스 플랫폼: 여러 운영체제 및 프로그래밍 언어에서 사용할 수 있습니다.
- 우수한 성능: 암호화/복호화 연산 속도가 빨라 성능이 중요한 환경에 적합합니다.
mcrypt의 대체제로서의 Sodium
기존에 PHP에서 널리 쓰이던 mcrypt 라이브러리는 더 이상 유지관리 되지 않고 보안 취약점이 발견되어, PHP 7.1에서 폐기되었으며 7.2에서는 완전히 제거되었습니다. 이에 따라 Sodium이 현대적이고 안전하며, 사용이 쉬운 대체 솔루션으로 도입되었습니다. Sodium은 보안성, 사용성, 성능 면에서 모두 우수하여, 신규 프로젝트에서는 mcrypt 대신 Sodium을 사용하는 것이 강력히 권장됩니다.
ServBay에서 Sodium 사용 및 활성화
ServBay의 PHP 7.2 이상 버전에는 Sodium 확장이 사전 컴파일되어 자동 활성화되어 있습니다. ServBay 사용자라면 별도의 설치나 설정 없이, 원하는 PHP 버전을 선택하고 실행하면 Sodium 함수들을 코드에서 바로 사용할 수 있습니다.
Sodium 확장이 활성화되어 있는지 확인하려면 ServBay의 phpinfo() 기능을 활용할 수 있습니다. ServBay 인터페이스에서 사용 중인 PHP 버전을 선택한 뒤 phpinfo()
항목을 찾아 출력 페이지에서 'sodium'을 검색하면 해당 모듈 정보를 확인할 수 있습니다.
PHP 코드에서 Sodium 확장 사용하기
Sodium 확장이 활성화된 것을 확인했다면, PHP 프로젝트에서 제공되는 다양한 함수를 자유롭게 사용할 수 있습니다. PHP 코드 파일을 ServBay 웹사이트 루트 디렉터리(기본 경로는 /Applications/ServBay/www
)의 원하는 서브 디렉터리에 저장한 뒤 브라우저로 접속해 실행하면 됩니다. 아래는 대표적인 사용 예제입니다.
예제 코드(대칭 암호화)
대칭 암호화는 한 개의 키로 암호화와 복호화 모두 수행합니다.
php
<?php
// 암호화할 메시지
$message = "This is a secret message from servbay.demo";
// 랜덤 비밀키 생성 (키 길이는 SODIUM_CRYPTO_SECRETBOX_KEYBYTES로 고정)
$key = sodium_crypto_secretbox_keygen();
// 랜덤 Nonce(한 번만 사용하는 값) 생성, 암호화와 복호화 모두 동일한 Nonce 사용 필수
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// 키와 Nonce로 메시지 암호화
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "원본 메시지: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce는 보통 암호문과 함께 저장하거나 전송
echo "암호문 (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- 복호화 과정 ---
// 이미 암호문, Nonce, 키를 가지고 있다고 가정
$retrieved_ciphertext = $ciphertext; // 저장 또는 전송된 암호문
$retrieved_nonce = $nonce; // 저장 또는 전송된 Nonce
$retrieved_key = $key; // 저장 또는 전송된 비밀키
// 키와 Nonce로 복호화
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// 복호화 성공 여부 확인
if ($decrypted === false) {
echo "복호화 실패!\n";
} else {
echo "복호화된 메시지: " . $decrypted . "\n";
}
// 민감 데이터 메모리에서 제거(메모리 누수 방지)
sodium_memzero($key);
sodium_memzero($retrieved_key);
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
예제 코드(비대칭 암호화)
비대칭 암호화는 한 쌍의 공개키와 비밀키를 사용합니다. 공개키로 암호화, 비밀키로 복호화합니다.
php
<?php
// 암호화할 메시지
$message = "This is another secret message for servbay-demo user";
// 키쌍 생성 (공개키 = 암호화에 사용, 비밀키 = 복호화에 사용)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // 상대방에게 공개
$secretKey = sodium_crypto_box_secretkey($keypair); // 본인 보관, 외부 유출 금지
echo "공개키 (Base64): " . base64_encode($publicKey) . "\n";
echo "비밀키 (Base64): [비밀키는 매우 민감하므로 직접 출력하거나 유출 금지]\n\n";
// --- 암호화 과정 (수신자의 공개키 사용) ---
// 발신자가 수신자의 $publicKey를 보유한다고 가정
// 랜덤 Nonce 생성, 암호화와 복호화 시 동일 Nonce 사용 필요
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// 수신자의 공개키와 발신자의 비밀키로 암호화([실전] 실전에서는 발신자의 비밀키 + 수신자의 공개키 조합 사용 필요)
// Sodium의 crypto_box는 Curve25519 기반으로, 양 측의 키 교환을 전제로 함
// 본 예제에서는 동일한 사용자 키쌍으로 자기 자신에게 암호화 및 복호화 진행
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // 이 간단 예제에서는 keypair에 공개/비밀키 모두 포함
echo "원본 메시지: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce는 암호문과 함께 저장 또는 전송 필수
echo "암호문 (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- 복호화 과정 (수신자의 비밀키 사용) ---
// 수신자가 암호문, Nonce, 자신의 비밀키($secretKey), 발신자의 공개키($publicKey)를 가지고 있다고 가정
// 본 예제에서는 keypair로 처리
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // 비밀키가 포함된 keypair로 복호화
// 자신의 키쌍을 써서 복호화
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// 복호화 성공 여부 확인
if ($decrypted === false) {
echo "복호화 실패!\n";
} else {
echo "복호화된 메시지: " . $decrypted . "\n";
}
// 민감 데이터 정리
sodium_memzero($secretKey); // 비밀키 정리
sodium_memzero($keypair); // 키쌍 정리
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
예제 코드(디지털 서명)
디지털 서명은 메시지의 무결성과 발신자 신원을 검증할 때 사용합니다. 비밀키로 서명하고, 공개키로 검증합니다.
php
<?php
// 서명할 메시지
$message = "This message needs to be signed by servbay.demo";
// 서명용 키쌍 생성 (비밀키 = 서명에 사용, 공개키 = 검증에 사용)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // 검증자에게 공개
$secretKey = sodium_crypto_sign_secretkey($keypair); // 본인 보관, 외부 유출 금지
echo "공개키 (Base64): " . base64_encode($publicKey) . "\n";
echo "비밀키 (Base64): [비밀키는 매우 민감하므로 직접 출력하거나 유출 금지]\n\n";
// --- 서명 과정 (발신자의 비밀키 사용) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "원본 메시지: " . $message . "\n";
echo "서명 (Base64): " . base64_encode($signature) . "\n\n";
// --- 검증 과정 (발신자의 공개키 사용) ---
// 검증자가 메시지, 서명, 발신자의 공개키($publicKey)를 가지고 있다고 가정
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// 공개키로 서명 검증
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "유효한 서명! 메시지가 위조되지 않았으며, 실제 비밀키 소유자가 보냈음을 확인.\n";
} else {
echo "서명 무효! 메시지가 위조되었거나, 올바른 비밀키로 생성되지 않았을 수 있음.\n";
}
// 민감 데이터 정리
sodium_memzero($secretKey); // 비밀키 정리
sodium_memzero($keypair); // 키쌍 정리
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
요약
ServBay를 이용하면 미리 설치되고 기본 활성화된 Sodium PHP 확장 기능을 바로 활용할 수 있습니다. 로컬 개발 환경에서 Sodium을 따로 설치하거나 설정할 필요 없이 쉽고 빠르게 강력한 암호화 기능으로 웹 애플리케이션 보안을 강화할 수 있습니다. Sodium은 mcrypt의 현대적 대체 라이브러리로, 안전하고 신뢰할 수 있는 웹 서비스 구축의 핵심 도구입니다. ServBay는 이를 단순화하여 개발자가 효율적이고 안전한 로컬 개발 환경을 쉽게 구성할 수 있도록 지원합니다.