728x90
반응형
nRF52 SDK를 이용한 블루투스 통신 데이터 암호화 방법
1. 서론
nRF52840과 같은 nRF52 시리즈 MCU는 BLE(Bluetooth Low Energy)를 지원하는 저전력 무선 통신 디바이스입니다. 무선 통신 환경에서는 데이터 보안이 매우 중요하며, 이를 위해 블루투스 통신에서 데이터 암호화를 적용하는 방법을 이해하는 것이 필요합니다.
이번 포스팅에서는 nRF52 SDK를 활용해 BLE 통신 시 데이터를 안전하게 암호화하는 방법을 단계별로 설명하고, 실습 예제 코드와 함께 구현하는 과정을 안내하겠습니다.
2. 블루투스 보안 개요
블루투스 보안은 다음과 같은 주요 요소로 구성됩니다.
- 페어링(Pairing): 두 기기가 신뢰 관계를 수립하는 과정
- 인증(Authentication): 장치 간의 신원을 검증하는 과정
- 암호화(Encryption): 데이터 전송 중 내용을 보호하는 과정
BLE에서는 주로 AES-CCM(128비트) 암호화 방식을 사용하여 데이터 무결성과 기밀성을 보장합니다.
3. 보안 매개변수 구성
암호화된 BLE 통신을 구현하려면 BLE 보안 매개변수를 설정해야 합니다. 다음은 주요 구성 항목입니다.
3.1 sdk_config.h
설정
#define NRF_BLE_GATT_ENABLED 1
#define NRF_SDH_BLE_GAP_DATA_LENGTH 251
#define NRF_SDH_BLE_GAP_EVENT_LENGTH 6
#define SEC_PARAM_BOND 1
#define SEC_PARAM_MITM 1
#define SEC_PARAM_LESC 1
#define SEC_PARAM_KEYPRESS 0
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE
#define SEC_PARAM_OOB 0
#define SEC_PARAM_MIN_KEY_SIZE 7
#define SEC_PARAM_MAX_KEY_SIZE 16
3.2 BLE 보안 매개변수 구조체 설정
static ble_gap_sec_params_t m_sec_params;
void sec_params_init(void) {
memset(&m_sec_params, 0, sizeof(m_sec_params));
m_sec_params.bond = SEC_PARAM_BOND;
m_sec_params.mitm = SEC_PARAM_MITM;
m_sec_params.lesc = SEC_PARAM_LESC;
m_sec_params.keypress = SEC_PARAM_KEYPRESS;
m_sec_params.io_caps = SEC_PARAM_IO_CAPABILITIES;
m_sec_params.oob = SEC_PARAM_OOB;
m_sec_params.min_key_size = SEC_PARAM_MIN_KEY_SIZE;
m_sec_params.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
}
4. 암호화된 통신 구현
4.1 페어링 및 암호화 요청
void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) {
switch (p_ble_evt->header.evt_id) {
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
NRF_LOG_INFO("보안 매개변수 요청 수신");
sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle,
BLE_GAP_SEC_STATUS_SUCCESS,
&m_sec_params, NULL);
break;
case BLE_GAP_EVT_AUTH_STATUS:
NRF_LOG_INFO("인증 상태: %d", p_ble_evt->evt.gap_evt.params.auth_status.auth_status);
break;
}
}
4.2 데이터 전송 시 암호화 적용
void send_encrypted_data(uint16_t conn_handle, uint8_t * data, uint16_t length) {
ble_gatts_hvx_params_t hvx_params;
memset(&hvx_params, 0, sizeof(hvx_params));
hvx_params.handle = m_characteristic_handle.value_handle;
hvx_params.type = BLE_GATT_HVX_NOTIFICATION;
hvx_params.offset = 0;
hvx_params.p_len = &length;
hvx_params.p_data = data;
uint32_t err_code = sd_ble_gatts_hvx(conn_handle, &hvx_params);
if (err_code != NRF_SUCCESS) {
NRF_LOG_ERROR("암호화된 데이터 전송 실패: %d", err_code);
} else {
NRF_LOG_INFO("암호화된 데이터 전송 성공");
}
}
5. 테스트 및 검증
5.1 nRF Connect App 활용
- 스마트폰에 nRF Connect 앱을 설치합니다.
- 디바이스를 스캔하고 연결합니다.
- 페어링 요청과 데이터 전송이 암호화된 상태에서 이루어지는지 확인합니다.
5.2 디버그 로그 확인
NRF_LOG_INFO("암호화 연결 성공!");
NRF_LOG_INFO("송신 데이터: %s", (char*)data);
6. 문제 해결
- 연결 실패: 보안 매개변수가 서로 일치하지 않는 경우
- 암호화 실패:
sd_ble_gap_sec_params_reply
설정 확인 - 성능 저하: 암호화 적용 시 전송 속도가 약간 느려질 수 있음
7. 결론
nRF52840과 nRF52 SDK를 활용하면 BLE 통신에서 데이터를 안전하게 보호할 수 있습니다. 본 포스팅에서는 보안 매개변수를 설정하고 암호화된 데이터를 송수신하는 방법을 소개했습니다. 향후 실무 프로젝트에서도 이와 같은 방식을 적용하면 무선 환경에서도 안전한 통신을 구현할 수 있습니다.
반응형
'nRF52' 카테고리의 다른 글
nRF52 SDK를 활용한 부트로더 단계에서 펌웨어 무결성을 검증하는 방법 (0) | 2025.02.20 |
---|---|
nRF52840 디지털 서명과 인증 - 데이터 서명과 검증 과정 ECDSA (0) | 2025.02.20 |
nRF52840 True Random Number Generator를 활용한 안전한 난수 생성 및 키 관리 (0) | 2025.02.20 |
nRF52840 ECC 공개 키 기반 암호화의 원리와 장점 (0) | 2025.02.20 |
HMAC와 nRF52 SDK를 활용한 실습 (0) | 2025.02.20 |