새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

4 분 소요

목표 D-day : 51 일

오늘은 대칭키 / 비대칭키 / 양방향 암호화 / 단방향 암호화에 대해서 학습하려고 합니다.

추가로 HTTPS에 대해서 간단한 학습을 했습니다.

암호화

cryptography

crypto = 비밀의, graphy = 기술 정리하면 비밀을 다루는 방법입니다.

cryptography는 세가지 특징을 가지고 있습니다.

  1. Confidentiality (기밀성):
    • 암호화된 데이터는 오직 권한이 있는 사람만 복호화할 수 있어야 하며, 중간에 데이터를 가로채더라도 원본 내용을 알 수 없도록 하는 것이 기밀성입니다.
  2. Integrity (무결성):
    • 무결성은 데이터가 전송 중에 변조되지 않고 안전하게 유지되었음을 보장합니다. 데이터가 전송되거나 저장되는 동안 손상이나 변경이 없었다는 것을 확인하는 것이 무결성의 핵심입니다.
  3. Authentication (인증):
    • 인증은 정보를 접근할 권한이 있는 사용자인지 확인하는 과정입니다. 예를 들어, 로그인 시스템에서 사용자의 신원을 확인하는 과정이 인증입니다. 인증된 사용자만이 암호화된 정보를 복호화하고 접근할 수 있습니다.

암호화 과정

암호화는 암호를 만들고 암호를 푸는 과정이 생깁니다.

평문 (plain text) > 암호화 알고리즘 > 암호문 (cipher text)

평문을 암호문으로, 암호문을 평문으로 만들기 위해서 방법이 필요하며 이것을 암호 알고리즘이라고 합니다. (cryptography algorithm)

평문을 암호 알고리즘으로 암호문으로 만드는 과정을 encryption (암호화) 암호문을 암호 알고리즘으로 평문으로 만드는 과정을 decryption (복호화)

암호화 방식

  1. 단방향 방식 : 데이터의 무결성을 보장하여 변조되지 않고 원본 데이터가 동일하다는 것을 활용합니다.
    • 해시
  2. 양방향 방식 : 데이터의 복호화가 필요하여 기밀성을 보장하도록 한다.
    • 대칭키
    • 비대칭키

[단방향 암호화 방법]

Hash라고 합니다 해시는 사전적 의미로 고기와 감자를 잘게 다진다고 합니다. 해시포테이토를 생각하면 됩니다. 데이터를 해시 알고리즘으로 변환하면 원래 상태로 되돌릴 수 없습니다.

단방향 암호화(해싱)의 원리

해시 함수는 임의의 크기의 데이터를 고정된 크기의 해시 값으로 변환합니다. 예를 들어 SHA-256은 입력값이 아무리 길어도 64자(256비트)길이의 해시 값을 생성합니다.

중요한 특징으로 단방향성입니다. 해시 값에서 원래의 입력값(데이터)을 유추하는 것은 거의 불가능합니다. 이는 crytograhy 특징인 무결성을 보장합니다.

무결성이란 원본 데이터가 조작되거나 훼손되지 않으면 해시의 결과물은 항상 동일하다는 의미입니다.

충돌 공격

해시 충돌은 두 개의 서로 다른 입력이 동일한 해시 값을 생성하는 경우를 말합니다. 변환된 결과의 고정된 길이가 작을 수록 해시 값의 경우의 수가 상대적으로 작습니다. MD5,SHA-1과 같은 경우 보안상 취약하여 보안에 사용되지 않습니다.

솔트

비밀번호 해시에서 자주 사용되는 개념 중 하나가 솔트입니다. 솔트는 해시 함수에 추가적으로 더하는 임의의 값으로 동일한 비밀번호라도 솔트 값에 따라 해시 값이 달라집니다.

따라서 솔트를 사용하면 레인보우 테이블(미리 계산된 해시 값으로 비밀번호를 찾는 공격)에 대한 방어가 가능합니다.

단방향 암호화 활용

  1. 비밀번호 저장:
    사용자 비밀번호는 평문으로 저장하지 않고 해시 함수로 처리한 후 저장해야합니다. 이는 데이터베이스가 유출되더라도 비밀번호가 노출되지 않도록 보호할 수 있습니다.

  2. 데이터 무결성 체크:
    파일이나 메세지의 전송 과정에서 조작이 발생했는지 확인하기 위해 해시 값을 비교할 수 있습니다. 전자서명, 파일의 식별자에 활용 가능합니다.

[양방향 방식]

대칭키

암호화를 위한 키가 클라이언트와 서버가 동일한 경우를 대칭키라고 하며 서버와 클라이언트는 동일한 암호 코드를 가지고 있습니다.

대칭키는 암호방식과 복호화방식이 동일하여 빠르며, 많은 데이터 처리, 크기가 작은 암호키가 큰 장점입니다.

다만, 최초 서버에 접속할 때 대칭키를 가진 쪽에서 없는 쪽에게 대칭키를 전달해야 합니다.

이 과정에서 대칭키가 유출될 수 있으므로 보안이 안전하지 않습니다.

비대칭키

공개키 public key 비공개키 private key

이 두개를 key pair라고 합니다.

평문을 암호화할 때 공개키로 암호문을 만듭니다.

  • 암호문은 공개키로 평문을 만들 수 없습니다.
  • 공개키의 짝인 비공개키만 평문을 만들 수 있습니다.

반대로 비공개키로 암호문을 만든다면 공개키로 평문을 만들 수 있습니다.

배달사고

암호 알고리즘에 사용하는 key를 혼자 가지고 있다면 대칭키를 사용하는게 맞다

대칭키 암호화가 연산 속도가 빠른 이유는 기본적으로 단순한 수학적 연산을 사용하기 때문입니다. 대칭키 암호화는 단일 키를 사용하여 데이터를 블록 단위로 암호화하고 복호화하는 방식을 사용합니다. 이 과정에 주로 단순한 비트 연산이나 XOR 연산을 반복적으로 수행하며, 이러한 연산은 CPU 자원을 많이 소모하지 않습니다.

비대칭키는 큰 소수의 곱셈이나 모듈러 연산등 복잡한 연산이 필요하여 더 많은 CPU 자원과 시간이 소모됩니다. 작은 크기의 데이터를 암호화하는데 사용하므로 큰 데이터를 직접 비대칭키로 암호화하는 것은 비효율적이며 성능이 떨어지기 때문입니다.

내가 가진 정보를 특정한 사람에게 보여준다면 그때는 복호화에 필요한 KEY를 전달해야합니다. 이 과정에서 KEY를 도난당할 수 있기 때문에 위험합니다.

전자서명

전자 서명을 작성한 내용을 개인키로 암호화하여 전달하면 받는측에서 서명을 공개키로 해독하여 동일한 사람인지 확인하는 원리

보안

어떤 암호화 알고리즘을 사용하는 것이 중요한게 아니라 암호 알고리즘 KEY를 어떻게 지키는 것이 중요합니다.

키값이 길어지면 암호화나 복화에 더 많은 자원이 필요합니다. 적정길이를 선택해야합니다.

그 시대에 어울리는 암호화 방식을 권고하고 있습니다. 권고안에 맞는 암호방식을 사용합니다.

HTTP와 HTTPS

HTTP

HTTP는 클라이언트와 서버 간에 데이터를 전송하는 규약입니다.

HTTP로 데이터를 주고 받을 때는 암호화가 적용되지 않아, 데이터가 도청될 위험이 있습니다.

HTTPS

HTTP에 암호화 기능을 추가한 프로토콜로, SSL/TLS를 통해 암호화를 합니다.

서버는 클라이언트에게 공개키를 제공하고, 클라이언트는 이를 사용해 데이터를 암호화한 후 서버로 전송합니다.

공개키가 유출되더라도, 공개키로 암호화된 정보는 공개키로 복호화를 할 수 없으므로 안전합니다.

HTTPS에서는 공개키와 개인키를 기반으로 통신이 이루어집니다.

CA

클라이언트는 서버가 신뢰할 수 있는 서버인지 확인 후 데이터 통신을 해야합니다.

이를 인증하는 민간 기업(CA: Certificate Authority)의 목록은 클라이언트 브라우저에 내장되어 있습니다.

클라이언트와 서버가 처음 통신하는 경우 서버 측은 공개키와 서버 인증서도 같이 전달합니다.

서버 인증서는 CA 기업의 개인 키로 암호화되었습니다.

그렇다는 것은 브라우저에 내장된 CA 기업의 공개 키로 복호화를 할 수 있습니다.

만약 브라우저에 내장된 공개키로 복호화가 안된다면 인증되지 않는 사이트 입니다.

사이트 인증서를 클라이언트 브라우저의 내장된 CA의 공개키로 복호화를 하면 서버 공개키가 포함되어 있습니다.

이 서버 공개키를 활용하여 비대칭키 방식으로 통신할 수 있습니다.

비대칭키는 많은 데이터를 전달할 때 사용하기 적절하지 않으므로 클라이언트와 서버간 연결 과정에서 전달받은 데이터를 혼합하여 임시키를 만듭니다.

임시키를 서버 공개키로 암호화하여 서버에 전달합니다.

서버는 개인키로 임시키를 복호화하고 이후 일련의 과정을 지나면 클라이언트와 서버는 동일한 대칭키를 만들게 됩니다.

이후 네트워크 통신은 대칭키를 통해서 데이터를 통신합니다.

인코딩과 디코딩

대학교 과목 수업중에서 사람과 사람이 대화를 할 수 있는건 언어라는 약속이 있듯이 컴퓨터와 개발자간 대화를 하기 위해서는 코드(=code)를 통해 의사소통이 가능합니다.

인코딩은 실제하는 정보를 컴퓨터가 이해할 수 있는 방식으로 코드로 만든 것이며

디코딩은 컴퓨터가 저장한 코드를 약속된 방식으로 실제 정보로 변환하는 것을 말합니다.

댓글남기기