Identity Protocol - Ten Posts Later, The Card Actually Unlocks the Door
Identity Protocol - Ten Posts Later, The Card Actually Unlocks the Door
W5500 + ATECC508A로 만드는 하드웨어 보안 인증 출입 시스템
개인키는 절대 칩 밖으로 나오지 않고, 문(door)은 오프라인에서도 스스로 판단한다. WIZnet W5500 이더넷과 Microchip ATECC508A 보안 IC를 결합한, 흔치 않은 하드웨어 기반 보안 출입 인증 사례를 소개합니다.
COMPONENTS
Hardware components
- WIZnet – W5500 (Ethernet FeatherWing) x 1
- Microchip – ATECC508A (Secure Element / 키 저장 / TRNG) x 1
- Maxim – MAX32630FTHR (MCU 보드) x 2
- BMI160 IMU (탈취 감지용) x 1
- 4x4 Keypad (PIN 입력) x 1
- PCA9685 Motor FeatherWing + 마이크로 모터 (도어 락) x 1
- Magnetic reed switch (문 개폐 감지) x 1
Software & Tools
- micro-ecc (ECDSA-P256 서명 검증)
- BTstack (BLE GATT 통신)
- Django (REST API + 관리 대시보드)
- Microchip CryptoAuthLib / Trust Platform Design Suite (TPDS)
본 글은 element14 커뮤니티에 공개된 arvindsa님의 Identity Protocol 프로젝트를 보안 관점에서 재구성·소개한 것입니다. 전체 원문과 코드는 글 하단 링크를 참고하세요.
PROJECT DESCRIPTION
문을 지날 때마다 카드를 찍고 PIN을 누르는 번거로움을 없애면서도 보안은 더 강하게 만들 수 없을까? 이 프로젝트의 답은 "비밀은 하드웨어가 지키고, 검증은 문이 직접 한다" 입니다. 카드 안의 ATECC508A에 저장된 개인키는 어떤 경우에도 칩 밖으로 나오지 않으며, 문(door)은 W5500 이더넷으로 서버와 통신하지만 네트워크가 끊겨도 캐싱된 공개키로 스스로 인증을 처리할 수 있습니다.
0. ATECC508A란? — 키를 "꺼낼 수 없게" 만드는 보안 IC
보안 설계에서 가장 어려운 문제는 "개인키를 어디에 안전하게 둘 것인가"입니다. 일반 MCU의 플래시에 키를 저장하면, 펌웨어를 덤프하거나 디버그 포트를 통해 키가 유출될 수 있습니다. ATECC508A는 바로 이 문제를 하드웨어로 해결하는 Microchip의 CryptoAuthentication 계열 보안 IC입니다.
핵심 특징은 다음과 같습니다.
- 변조 방지 키 저장: 개인키는 칩 내부의 보호된 영역에 생성·저장되며, 외부로 절대 읽혀 나오지 않습니다. MCU조차 키 값을 알 수 없고, "이 키로 서명해 줘"라고 요청할 수만 있습니다.
- 하드웨어 암호 엔진: ECC P-256 기반의 ECDSA(서명/검증) 와 ECDH(키 교환), 그리고 SHA-256 을 하드웨어로 처리합니다.
- 내장 TRNG: 진정한 난수 생성기를 내장해, 챌린지·키 생성에 필요한 고품질 난수를 제공합니다.
- 간단한 인터페이스 / 초저전력: 단선(single-wire) 또는 I²C로 연결되며, 대기 전류는 약 2µA 수준으로 배터리 장치에도 적합합니다.
즉, ATECC508A를 쓰면 "물리적으로 장치를 분해해도 키는 안전하다"는 하드웨어 신뢰 루트(Hardware Root of Trust) 를 확보할 수 있습니다. 이 프로젝트에서 카드의 개인키가 PIN 인증 후에도 칩 밖으로 나오지 않는 이유가 바로 이것입니다.
참고: 본 프로젝트는 ATECC508A를 사용했지만, 신규 설계라면 후속 제품인 ATECC608 계열도 함께 검토하시길 권장합니다(아래 "신규 설계 시 참고" 참조).
1. Trust Platform Design Suite(TPDS) — 보안 IC를 쉽게 시작하는 도구
보안 IC가 강력해도, "어떤 슬롯에 어떤 키를 넣고, 어떻게 프로비저닝(provisioning)할 것인가"를 처음부터 설계하기는 쉽지 않습니다. Microchip의 Trust Platform Design Suite(TPDS) 는 이 진입 장벽을 낮춰 주는 온보딩(onboarding) 도구입니다.
TPDS가 제공하는 것:
- 보안 개념 학습/교육: 인증, 키 관리 등 보안 개념을 학습할 수 있는 자료를 제공합니다.
- 프로토타이핑: 더미(dummy) 키 생성과 코드 예제를 인터랙티브 애플리케이션 노트 형태로 제공해, 실제 양산 키 없이도 동작을 먼저 검증할 수 있습니다.
- 프로비저닝 시스템 연계: 보안 서브시스템 컨피규레이터(configurator)와 안전한 키 교환(secure exchange) 프로세스를 통해 양산 프로비저닝까지 연결됩니다.
실무적으로는, TPDS에서 슬롯 구성(어느 슬롯을 서명용·읽기 금지로 둘지 등)을 설계하고, 코드 예제로 동작을 검증한 뒤, CryptoAuthLib 드라이버로 펌웨어에 통합하는 흐름을 권장합니다. 이렇게 하면 이 프로젝트의 crypto.c(ATECC508A wake / sign / serial 읽기)처럼 깔끔한 추상화 계층을 빠르게 만들 수 있습니다.
2. 동작 원리 (Challenge–Response)
- 카드와 문이 BLE로 1회 페어링합니다.
- 문이 매 연결마다 새로운 랜덤 챌린지(nonce)를 발급합니다.
- 카드는 PIN 인증 후, ATECC508A 내부 키로 챌린지에 서명합니다.
- 문은 서버에서 받은 공개키로 ECDSA-P256 서명을 로컬에서 검증합니다.
- 블랙리스트에 오른 카드라면, 서버 통신 없이 문이 즉시 거부합니다.
3. 카드 장치 – ATECC508A로 키 보호하기
개인키는 ATECC508A의 슬롯에 봉인되어 절대 추출되지 않습니다. 서명은 PIN 인증 이후에만 허용됩니다.
crypto_init(); // ATECC508A wake, 시리얼 읽기 → device_id // PIN 인증 통과 시에만 slot-0 데이터 서명 수행, 그 외에는 거부추가 안전장치로, IMU(BMI160)가 갑작스러운 흔들림(탈취 시도)을 감지하면 카드를 즉시 잠급니다.
if (imu_jerk() > JERK_LOCK_THRESHOLD) pin_state_force_lock(); if (pin_state_timed_out()) pin_state_force_lock();4. 도어 장치 – W5500로 검증 노드 구성하기
문은 W5500을 통해 고정 IP로 네트워크에 연결되어 서버에서 공개키와 블랙리스트를 동기화합니다. W5500의 하드웨어 TCP/IP 스택이 네트워킹을 MCU에서 분리해 주므로, 펌웨어가 가볍게 유지되고 공격 표면도 좁아집니다.
eth_init(); // SPI 초기화 후 W5500 구동 eth_static_ip(IP, MASK, GW); keystore_init(); // eth_sync_pubkeys() 시도, 실패 시 컴파일 내장 키로 폴백 auth_server_init(); // BLE "Auth-Door" 광고, 커스텀 GATT5. 매 연결마다 새로운 챌린지 발급
재전송(replay) 공격을 막기 위해, 문은 연결할 때마다 새로운 32바이트 nonce를 만들어 카드에 전달합니다.
uint16_t on_read_challenge(uint8_t *out) { crypto_nonce(out, 32); memcpy(active_nonce, out, 32); return 32; }6. 서명 검증 + 블랙리스트 로컬 차단
응답을 받으면 먼저 블랙리스트를 확인하고, 통과한 경우에만 micro-ecc로 서명을 검증합니다. 블랙리스트 차단은 서버 통신 없이 로컬에서 즉시 이루어집니다.
int on_write_response(const uint8_t *buf, uint16_t len) { if (len != 4 + 64) return -1; uint32_t device_id = be32(buf); if (blacklist_contains(device_id)) { // 로컬 즉시 차단 log_event(device_id, RESULT_BLACKLISTED); return -2; } const uint8_t *pubkey = keystore_lookup(device_id); // micro-ecc로 ECDSA-P256 서명 검증 → 통과 시 모터 언락 }7. 서버 & 결과
Django 기반 서버는 REST API와 관리 대시보드(키, 출입 로그, 블랙리스트)를 제공합니다. 대시보드에서 카드를 블랙리스트에 추가하면, 다음 시도 때 문이 자동으로 거부합니다.
- 카드: PIN 입력 / 흔들림·타임아웃 잠금 정상 동작
- ATECC508A: PIN 인증 후에만 서명, 그 외 거부 정상 동작
- 문: 매 연결 새 nonce 발급, micro-ecc 검증 정상 동작
- 블랙리스트 동기화 왕복(대시보드 → 문) 정상 동작
- W5500 미연결 시 내장 키스토어 폴백 정상 동작
보안 설계 포인트 (Takeaways)
이 프로젝트는 보안 임베디드 제품 설계의 핵심 3계층을 잘 보여줍니다. 첫째, 물리적 접근이 있어도 키를 복제할 수 없게 하는 보안 IC(ATECC508A). 둘째, 네트워크가 끊겨도 안전하게 동작하는 로컬 검증. 셋째, 네트워킹을 단순화하고 펌웨어를 가볍게 유지하는 하드웨어 이더넷(W5500) 입니다. 그리고 TPDS는 이 보안 IC를 실제 제품에 빠르고 안전하게 적용할 수 있게 해 주는 출발점입니다.
개선 여지: 원작자는 W5500 연결이 약 5회 중 1회 실패했다고 밝혔고(SPI 배선/타이밍·소켓 처리 점검 권장), 문 측 난수가 ADC 노이즈+xorshift라는 점도 한계로 언급했습니다. 양산 시에는 ATECC508A의 내장 TRNG를 활용하는 것이 자연스러운 강화 방향입니다.
신규 설계 시 참고: Microchip 공식 기준 ATECC508A는 현재 "신규 설계 비권장" 상태입니다. 새 제품을 설계한다면 후속 제품(예: ATECC608 계열)을 함께 검토하시길 권장합니다. 동작 원리와 TPDS 활용 흐름은 동일하게 적용됩니다.
Documents
- 원문 프로젝트: element14 커뮤니티 – Identity Protocol (by arvindsa)
- code:
https://github.com/arvindsa/identity-protocol-e14-challenge - ATECC508A 제품 페이지 / 데이터시트: Microchip 공식 사이트
- Trust Platform Design Suite (TPDS): Microchip 공식 사이트
