티스토리 뷰
지난번 개인 프로젝트 때 Jenkins 서버에서 배포 서버에 접근하기위해 RSA키와 .pem 파일을 가지고 접근을 허용해주어 배포할 수 있었던 기억이 있었습니다. 그리고 현재 이 방식에 대해 공부해보고 앞으로 프로젝트에서 좀 더 잘 알고 배포하고자 정확히 뭔지에 대해 알기 위해 정리해보려고합니다.
대칭 키
대칭키는 암호화 방식은 암호화와 복호화에 동일한 키를 사용하는 암호화 기법이니다. 데이터를 암호화할 때 사용한 키를 그대로 복호화에도 사용하여 키를 그대로 복호화에도 사용하여 데이터를 해독합니다. 대칭키 암호화는 암호화와 복호화 과정에서의 연산이 빠르기 때문에 대량의 데이터를 빠르게 처리하는 데에 적합합니다.
대칭키 암호화에서는 키라는 값이 중요한 역할을 합니다. 키는 비밀로 유지되어야 하며, 암호화된 데이터를 복호화하려면 동일한 키가 필요합니다. 이 키는 암호화 알고리즘에 의해 데이터와 결합되어 변환되며, 암호문을 생성화거나 복호문을 만드는데 사용됩니다.
대칭키 방식의 장점은 연산 속도가 빠르고 구현이 간단하며, 대량의 데이터를 빠르게 처리할 수 있다는 것입니다. 그러나 키 관리 측면에서의 안정성이 필요하며, 키를 안전하게 공유하는 문제와 키 관리의 복잡성이 주요한 단점입니다.
직접 예제를 보여드리면 다음과 같습니다.
echo 'Hello World' > helloWorld.txt;
위 명령어로 txt 파일을 만들고 openssl 명령어로 des3 알고리즘으로 암호화를 합니다.
openssl enc -e -des3 -salt -in helloworld.txt -out encrypt.bin;
위 명령어를 입력하면 비밀번호를 입력하라고 나옵니다. 이 때 본인이 복호화 시에도 사용해야하니 반드시 비밀번호를 기억해둬야합니다.
비밀번호를 입력하고 나면 복호화를 합니다.
openssl enc -d -des3 -salt -in encrypt.bin -out helloworld2.txt;
위 명령어를 입력하고 암호화 시 사용했던 비밀번호를 입력하면 복호화가 완료됩니다.
그리고 ls -al | grep '.*[.]txt'
명령어로 확인해보면 helloWorld와 helloworld2가 각각 txt파일로 저장한 걸 확인할 수 있습니다. 이 처럼 대칭된 암호를 가지고 암호화 후 복호화가 가능한 방식을 대칭키 방식이라고 합니다.
공개키
공개키 암호화 방식은 암호화와 복호화에 서로 다른 키를 사용하는 암호화 기법입니다. 이 방식에서는 공개 키와 개인 키라는 두 개의 키 쌍을 사용합니다. 공개키는 누구나 알 수 있고 공개할 수 있는 키 이며, 개인키는 해당 키 쌍을 생성한 사용자 만이 알고 있는 비밀로 유지되어야 하는 키입니다.
공개키 암호화에서는 데이터를 암호화할 때 공개키를 사용하며, 암호화된 데이터를 복호화 하려면 해당 공개키에 대응하는 개인키가 필요합니다. 이러한 키 쌍은 수학적인 알고리즘에 의해 생성되며, 공개키로 암호화 된 데이터는 개인키로만 복호화할 수 있습니다.
공개키 암호화는 대칭키 암호화와 달리 키 교환의 문제를 해결할 수 있습니다. 대칭키 암호화에서는 키를 안전하게 공유해야 했지만, 공개키 암호화에서는 암호화에 사용되는 공개키를 누구나 알 수 있으므로 안전한 채널을 통해 개인키를 공유하는 것만으로도 안전한 통신이 가능합니다.
공개키 방식의 장점은 안전한 키 교환과 키 관리의 용이성입니다. 그러나 연산 속도가 대칭키 암호화보다 느리고, 암호화에 사용되는 키의 길이가 대칭키에 비해 상대적으로 길어야 한다는 단점이 있습니다. 따라서 공개키 암호화는 주로 안전한 키 교환과 디지털 서명등의 보안 기능에 활용됩니다.
그럼 대표적인 방식인 RSA 방식을 이용해 공개키 암호화를 해보겠습니다.
openssl genrsa -out private.pem 1024;
위 명령어를 통해 priavte.pem이라는 이름의 key를 만들고 길이는 1024bit를 갖습니다. 이 숫자가 높을 수록 안전합니다.
openssl rsa -in private.pem -out public.pem -outform PEM -pubout;
위 명령어는 공개키를 만듭니다. 공개키를 가진 사람이 비공개 키를 가진 사람에게 특정 파일을 전송한다고 가정하면 다음과 같은 과정이 필요합니다.
echo 'Private World' > privateWorld.txt;
openssl rsautl -encrpyt -inkey public.pem -pubin -in privateWorld.txt -out file.ssl;
openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt;
이번엔 keygen 명령어를 이용해 암호화 해보겠습니다. 마찬가지로 rsa 알고리즘을 사용합니다.
ssh-keygen -t rsa
파일 위치를 지정해주고 이후 비밀번호를 입력하면 정해준 경로에 id_rsa와 id_rsa.pub 파일이 생성됩니다.
그리고 scp 명령어를 이용해 다른 서버로 id_rsa.pub 공개키를 전송하면 이제 원격서버 끼리 암호화 된 상황에서 안전하게 통신을 주고받을 수 있습니다.
결론
두 가지 방식 모두 알아보았습니다. 보통 ssl 인증서를 통해 Https기반의 protocol은 두 가지 방식 모두를 이용하고 위 처럼 배포 서버간 통신시에는 공개키 방식으로 통신합니다. 이 때 개인키와 공개키는 각각 600, 700 파일 권한을 주어 외부에서의 접근을 절대 못하게 해야하며 변경도 일어나선 안됩니다.
또한 두 방식은 모두 유출 되면 공격자에 의해 데이터가 복호화 될 수 있는데 이런 위험에도 불구하고 사용하는 이유는 이 방식은 데이터 보호보다는 암호화된 데이터를 공개키를 가지고 복호화 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개 키에 의해서 암호화 되었다는걸 의미하기 때문에 공개키가 데이터를 제공한 사람의 신원을 보장해줍니다. 이를 전자서명이라고 하는데 이러한 방식으로 좀 더 출처가 명확한 안전한 데이터를 사용할 수 있는 것입니다.
마침.
'보안' 카테고리의 다른 글
[보안] SSL 인증서란? (1) | 2023.05.16 |
---|
- Total
- Today
- Yesterday
- MySQL
- java
- DB
- 프로그래밍
- 면접준비
- CS
- 프로젝트
- 취업준비
- 코드
- 자바
- JPA
- DevOps
- docker
- 개발
- 면접 준비
- Spring
- 면접
- 백엔드
- 게시판
- Kotlin
- 코딩
- IT
- 취업
- thread
- 동시성
- Redis
- 취준
- swarm
- 개발자
- 인터뷰
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |