1. 공동인증서 구조
공동인증서는 단순한 파일이 아니라, 내부에 다양한 정보와 보안 매커니즘을 포함한 인증체계이다.
인증서 내부에는 복호화키인 주체의 공개키, 주체, 발급자, 시리얼정보, VID 등 다양한 정보가 포함된다.
- 발급자의 서명
1) 인증서 내부 값들을 HASH 알고리즘을 통재 지문을 생성
2) 해당 지문을 발급자(인증기관/CA)의 개인키로 암호화
3) 암호화된 값을 = 발급자의 서명 이라고 부르며, 공동인증서에 포함
-> 서명을 통해 공동인증서의 무결성과 신뢰성이 보장됨
1-1. 내부 데이터 확인하기
- certutil, openssl, ASN1.decoder 등을 통해 공동인증서 내부의 값을 분석 가능
- 서버에서는 공동인증서 내부의 값(CN, DN, Serial, VID)을 추출하여 유효기간 및 사용자 검증을 실시하므로 해당 데이터 필드 검증 필요
- 취약점 점검 시 주의할 점
- 서버단에서 인증서의 명의자에 대한 검증필수
ex) 고객정보(주민등록번호)로 인증서가 발급되었음을 확인해야함 (인증서VID검증)
- 검증로직이 생략될 경우, 타인의 인증서를 이용하여 서비스가입/이용 가능
2. 전자서명 과정
서명(Signing)은 Data를 해쉬(HASH)된 값으로 나타낸 뒤, 개인키로 RSA로 암호화하는 과정을 수행한다.
암호화된 해쉬값이 전자서명이며, 송신자의 신원을 증명하는 역할을 한다.
이후, 전자서명에 공동인증서를 첨부하고, 원본데이터와 함께 수신자에게 전달된다.
검증(verification)에서는 공개키를 사용해 암호화를 복호화시킨 해쉬값과 Data를 해쉬로 변환한 값을 비교하여 검증한다. 이를 통해 무결성과 인증을 보장하게 된다.
3. 공동인증서 본인확인 식별번호(VID)
1) VID 값의 생성 방식
- VID(Value Identifier)는 개인의 고유 식별 정보(예: 주민등록번호 또는 고유한 ID)를 암호학적으로 안전한 방법으로 해시화하여 생성한다
- 일반적으로 SHA-256 같은 해시 알고리즘을 사용한다. 해시 알고리즘은 입력값(예: 주민등록번호)으로 고정된 길이의 해시 값을 생성한다.
- 예를 들어, 주민등록번호 123456-7890123가 입력값이라면, 이를 SHA-256으로 해시화하여 32바이트의 해시 값이 생성된다. 이 해시 값이 VID로 사용된다.
=> VID = h(h(IDN, R), 가입자의 식별번호 IDN, 가입자의 개인키에서 추출한 R값으로 가상 식별번호 VID 값을 생성한다
2) 복호화 가능성
- 해시 함수는 일방향 함수임. 즉, 입력값으로부터 해시 값을 계산하는 것은 쉽지만, 해시 값만으로 원래의 입력값을 알아내는 것은 매우 어렵거나 불가능하다.
- SHA-256 같은 해시 알고리즘은 설계상 복호화할 수 없으며, 이는 보안을 강화하기 위한 것이다.
- VID 값은 입력된 개인 정보를 보호하기 위해 해시화된 것이기 때문에, 이 값을 복호화하여 원본 정보를 얻는 것은 불가능하다.
3) VID값 확인
ASN.1로 인코딩된 데이터(예: X.509 인증서, 네트워크 프로토콜 메시지 등)를 디코딩하면 구조화된 데이터를 읽을 수 있게 된다. 온라인 ASN.1 decoder를 사용하여 확인가능하다.
VID값의 오프셋 위치 : 3D8- 3F7
(32byte)
hex : 5E A4 DD 7A 5E 5D 87 5A 86 C0 ............
값 : 5EA4DD7A5E5D875A86C0F5A48DD000.............
참고자료
https://d2.naver.com/helloworld/744920
https://epicarts.tistory.com/156
https://en.wikipedia.org/wiki/Electronic_signature