잡동사니

인증 서비스에 필요한 암복호화 지식 본문

IT

인증 서비스에 필요한 암복호화 지식

yeTi 2022. 3. 17. 14:41

안녕하세요.
yeTi입니다.

금일은 SNS서비스의 인증 서비스를 개발하면서 사용했던 암복호화에 대한 기본 지식을 공유해보고자 합니다.

인코딩 (Encoding)

인코딩이란, 어떤 정보를 정해진 규칙에 따라 변환하는 것을 말합니다.

이를 테면 컴퓨터가 사용하는 이진 데이터를 사람이 인식할 수 있는 문자로 변화하는 것도 바이트 데이터의 인코딩(UTF-8)에 의해 생성되는 것입니다.

헥사 (HEX)

헥사 인코딩이란, 2진 바이너리 데이터를 16진수 데이터로 표현하여 데이터량을 줄여주는 역할을 한다.

URL

URL 인코딩은 URL에서 정의한 예약어를 다른 형태로 치환해주는 역할을 합니다.

Base64

Base64 인코딩 은 64진수 인코딩으로 헥사 인코딩보다 더 간결하게 데이터를 표현할 수 있습니다.

Base64 URL Safe

URL을 활용하여 데이터를 요청하고 싶을때 앞서 언급했던 URL 인코딩을 바로 해도 되지만 좀더 간결한 표현을 위해 base64 인코딩 후 URL 인코딩을 하여 사용할 수 있습니다.

해시 (Hash)

해시는 임의의 길이를 갖는 임의의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다.

해시는 원래의 문장을 복호화할 수 없게 뭉개버린다는 점, 그리고 원문과 해시값 사이에 선형적 관계가 없다 점, 고정된 길이의 숫자를 반환한다는 점 때문에 보안 분야에서 널리 사용합니다.

SHA (Secure Hash Algorithm)

SHA 는 미국의 국가 표준으로 지정할 만큼 안전한 해시 알고리즘입니다.

암호화

암호화 는 특정한 키를 기반으로 데이터를 인코딩하는 행위입니다. 따라서 해당 키를 가지지 않은 인가자로 부터 데이터를 보호하는데 목적을 두고 있습니다.

해시도 데이터를 인코딩할 수 있는 방법중 하나이지만 복호화를 할 수 없다는 점이 큰 차이점입니다. 따라서 의도적으로 복호화를 하지 못하게 하는 인코딩하기 위해서 해시를 사용하기도 합니다.

AES (Advanced Encryption Standard)

AES 는 미국 표준 기술 연구소에 의해서 연방 정보 처리 표준으로 지정된 암호화 방식이며 NSA에 의해 1급 비밀에 사용할 수 있도록 승인된 암호화 알고리즘 중 유일하게 공개된 알고리즘입니다.

대칭키를 사용하므로 상호간 동일한 키를 가져야하고, 송수신자 중 한쪽이라도 키를 탈취 당하면 탈취한 대상도 동일하게 암복호화를 수행할 수 있다는 단점이 있습니다.

참고 자료

RSA

RSA 는공개키 암호시스템의 하나로 암호화뿐만 아니라 전자서명이 가능한 최초의 알고리즘입니다.

비대칭키를 사용하며 공개키를 가진 대상은 암호화 및 사인(Sign) 유효성을 확인할 수 있고 개인키를 가진 대상은 복호화 및 사인을 생성할 수 있습니다.

공개키는 말 그대로 불특정 다수에게 제공하는 키 이므로 이는 탈취당하여도 개인키가 없다면 암호화 데이터를 복호화 할 수 없습니다.

하지만 자바에서 지원하는 RSA 알고리즘은 256바이트내의 데이터만 암호화가 가능합니다.

이러한 데이터 길이제한 때문에 데이터는 AES로 암호화 하고 AES키를 RSA로 암호화 하는 전자봉투 방식을 사용한다.

ECC (Elliptic Curve Cryptography)

ECC 는 기존 RSA 암호방식에 대한 대안으로 1985년도에 제안된 방식입니다.

RSA/DSA와 같은 공개키 암호보다 짧은 키 길이와 빠른 연산속도를 가지면서 동일한 수준의 보안 강도를 제공한다. 보안을 강화하기 위해서 암호키의 길이를 늘이는 방법이 있지만, 그에 따라 암호 연산 속도가 느려진다는 문제가 있습니다. 그래서 RSA 방식을 사용하여 암호키 길이를 늘이는 대신 타원곡선암호 기술을 선택하는 경우가 많습니다.

대표적인 알고리즘으로는 타원곡선 디피-헬먼 (Elliptic-curve Diffie–Hellman, ECDH) 이 있습니다.

참고 자료

디지털 서명 (Digital Signature)

비대칭키를 사용한 암호화 방식 중 하나는 디지털 서명 이 있습니다.

예를 들어, 문서를 전송하는 주체에 대한 정보가 문서에 포함되는 경우가 많지만, 그 정보가 잘못될 가능성은 언제든지 존재합니다. 이 때, 디지털 서명을 사용하여 문서의 원본 발신처를 인증하는 데에 사용할 수 있습니다.

디지털 서명에 사용되는 개인 키 값의 소유권을 특정 이용자에게 인증될 수 있을 때, 서명이 유효하다면 그 문서가 개인 키 값을 소유한 사람에게서 발신되었다는 것을 확인할 수 있게 되는 것입니다.

IOS와 연동 사례

IOS에서는 Secure Enclave를 사용하여 전용 보안 시스템을 사용할 수 있습니다. (Storing Keys in the Secure Enclave)

이 때,
IOS에서는 SecKeyCopyExternalRepresentation(::) | Apple Developer Documentation을 사용하는데 이 함수는 elliptic curve public key를 반환하기 위해서 ANSI X9.63 standard using a byte string of 04 || X || Y포맷을 사용합니다.

이렇게 생성한 publicKey는 외부에 공유하면 DER format이 아니기 때문에 load 할 수 없습니다. (Creating and exporting cryptograph Asymmetric Keys in Swift)

따라서 Storing a DER-Encoded X.509 Certificate 하여 DER format으로 변환하여 공유해야 하는 이슈가 존재합니다.

이를 해결해기 위해 IOS에서 BlueECC를 사용할 수 있습니다.

또한 서버-IOS간 Key 로드 및 서명 검증이 원활하게 진행되지 않을 때는
openssl을 활용하여 키를 발급하여 진행하는 방식으로 해결할 수 있습니다.

참고 자료

Comments