데이터 보안을 위한 암호화와 적용 예시
20 July 2021
데이터 보안을 위한 암호화와 적용 예시
암호화 방식
암호화를 하는 방식에는 암호화 복호화가 가능한 대칭/비대칭형 암호화 방식과 해싱을 이용해 암호화 만 가능한 방식이 있습니다.
대칭형 암호화
대칭형 암호화는 1개의 키를 가지고 암호화, 복호화가 가능한 방식입니다.
고유의 키를 가지고 암호화와 복호화가 모두 가능하기 때문에 키가 외부에 공개될 경우 보안에 취약해진다는 위험이 존재합니다.
내부에서만 정해진 키를 가지고 데이터를 주고 받거나 비대칭형 암호화와 같이 사용하여 키를 전달할 경우에만 적합한 방식입니다.
대표적인 예시로 AES 가 있습니다. 블록 암호화 방식에 따라 ECB, CBC, GCM 등의 방식이 있으며 이중 AES-GCM 이 유추 하기 여려워 많이 이용되고 있습니다.
인텔 CPU 중 AES-NI 라는 하드웨어 가속이 포함된 CPU 를 이용해 AES의 속도를 높일 수 있으나, 최근에는 ChaCha20 이라는 알고리즘이 등장하면서 하드웨어 가속 없이도 매우 빠른 속도를 보여줘 주목 받고 있습니다.
최근에 WireGuard 라는 Linux Kernel 내부에 Native 로 동작하는 VPN 이 등장하면서 ChaCha20-Poly1305 방식을 채택하였는데, 기존에 많이 사용되던 VPN 인 OpenVPN 의 AES-GCM 방식에 비해 3배 이상 빠른 놀라운 속도를 보여주고 있습니다. 이로인해 임베디드 환경에서와 같이 Custom 이 가능한 공유기에서도 VPN 사용을 위해 WireGuard 를 많이 사용하고 있습니다.
저희는 미들웨어 간에 IPMI 제어를 위해 필요한 IPMI 사용자 패스워드를 암호화 및 복호화 하기 위하여 ChaCha20-Poly1305 방식을 사용하고 있습니다.
비대칭형 암호화
비대칭형 암호화는 암호화와 복호화의 키가 서로 다른 방식입니다.
비대칭형 암호화에는 외부에 공개가 가능한 공개키와 외부에 공개해서는 안되는 자신만이 가지고 있는 개인키를 사용하여 암호와와 복호화를 합니다.
대칭형 암호화에 비해 속도가 느리다는 단점이 있습니다.
대표적인 예시로 공인인증서에서 사용되는 RSA 가 있습니다.
-
공개키로 암호화 할 경우
데이터를 보낼때 특정 상대방에게만 복호화가 가능하도록 할 경우 사용합니다.
상대방에게 공개키를 전달받아 해당 공개키로 데이터를 암호화 한 후 암호화된 데이터를 상대방에게 전달하면 상대방은 자신이 가지고 있는 개인키로만 데이터를 복호화 할 수 있습니다.
-
개인키로 암호화 할 경우
해당 데이터를 제공하는 자의 신원 확인을 위해 사용합니다.
제공하고자 하는 데이터를 개인키로 암호화 한 후 해당 데이터를 공개키와 함께 제공하면, 데이터를 받은 사람들은 같이 전달 받은 공개키를 통해 데이터를 복호화 하여 데이터의 출처에 대한 신원 확인이 가능해 집니다.
단방향 암호화
해싱을 이용해 평문을 암호화 하는 방식입니다. 암호화된 결과값은 해싱에 사용된 알고리즘에 따라 정해진 길이로 나오게 됩니다.
이 점을 이용해 저희 포탈에서는 Secret Token 이라는 특정값을 단방향 암호화를 통해 일정길이의 값을 얻은 후 이를 대칭형 암호화의 Key 값으로 이용하는 방식을 채택하고 있습니다.
해싱은 복호화가 불가능 하지만 알고리즘의 복잡도에 따라 무차별 대입 방식을 사용하여 평문을 유추할 수 있는 경우가 있습니다. 대표적인 예시가 MD5 이며, 따라서 평문을 유추하기가 어려운 sha256, sha512 같은 해싱 알고리즘을 사용하는 것이 안전합니다.
또한, Bcrypt 라는 알고리즘이 존재 하며 해당 알고리즘은 암호화를 할때마다 나오는 결과값이 달라 지기 때문에 현재 저희 클라우드 서비스의 포탈을 로그인 할때 암호화 하는 방식으로 사용하고 있습니다.
적용 예시
저희는 클라우드 서비스를 서비스에 로그인을 할때의 암호화와 사용자 계정정보의 패스워드 보안을 위해 다음과 같은 방식을 적용 하였습니다.
포탈 로그인시 사용자 인증
- 데이터베이스에는 sha256 으로 해싱된 사용자의 암호가 저장되어 있습니다.
- 포탈 로그인시 사용자로 부터 암호를 입력 받습니다.
- 입력받은 평문 암호를 sha256 으로 해싱합니다.
- 해싱된 값을 Bcrypt 를 통해 다시 암호화 합니다. 이때 결과 값의 길이는 일정하지만 값이 매번 달라지게 됩니다.
- 암호화된 Bcrypt 값을 Middleware 로 전달합니다.
- Middleware 에서 데이터베이스에 있는 sha256 으로 해싱된 사용자의 암호를 Bcrypt 를 통해 암호화 합니다.
- Bcrypt 의 Compare 함수를 사용하여, 4. 에서 나온 Bcrypt 값을 6. 에서 나온 Bcrypt 값과 비교합니다.
- Compare 함수에서 동일한 값으로 부터 (동일한 sha256 해싱값) 암호화 된 것이 확인 되면 패스워드가 일치하는 것으로 판단하여 로그인이 성공합니다.
- 이에 추가적으로 JWT (JSON Web Tokens) 를 사용하여 암호화된 Bcrypt 값과 Expiration Date 를 전달하여 사용자 세션의 만료 시간을 같이 체크 하도록 하고 있습니다.
Node 를 IPMI 로 제어하기 위한 IPMI 패스워드 암호화
- 사용자가 Secret Key 값을 지정합니다.
- IPMI 패스워드를 ChaCha20-Poly1305 로 암호화 합니다. 이때 256bit 크기의 Key 값과 96bit 크기의 nonce 값(데이터 보안을 위한 암호화와 적용예시/복호화시 임의로 사용되는 값)을 필요로 합니다. 따라서 Key 값으로 길이가 64인 byte 배열을 사용할 수 있습니다.
- 해싱 암호화 방식중 SHA256 을 사용하면 길이가 64인 hex 값을 얻을 수 있습니다. 이점을 이용하여 사용자가 지정한 Secret Key 값을 SHA256 으로 해싱하여 이를 ChaCha20-Poly1305 의 Key 값으로 사용합니다. 이로써 사용자는 길이에 상관없이 Secret Key 값을 지정할 수 있습니다.
- ChaCha20-Poly1305 으로 암호화 하여 나온 결과 값을 Database 에 byte 배열로 저장합니다.
- 복호화시에도 마찬가지로 사용자가 지정한 Secret Key 값을 SHA256 으로 해싱하여 얻어낸 값을 ChaCha20-Poly1305 의 Key 값으로 평문 암호를 얻어낼 수 있습니다.
이상으로 지금까지 설명해드린 내용을 참고하여 네트워크 상에 오고 가는 데이터에 암호화를 적용하여 데이터를 안전하게 전달할 수 있는 환경을 구축해 보시기 바랍니다.
감사합니다.