[ CS ] SSL / TLS

kkatal_chae·2023년 3월 27일
0

Computer Science

목록 보기
4/4

SSL (Secure Sockets Layer) 및 이어지는 TLS (Transport Layer Security)는 인터넷 상에서 데이터를 안전하게 전송하기 위한 프로토콜입니다. 이 프로토콜은 데이터를 암호화하여 중간자 공격 및 데이터 유출 등의 보안 위협으로부터 데이터를 보호합니다.


SSL 및 TLS는 공개키 암호화 방식을 사용합니다. 이 방식은 두 개의 키를 사용하여 데이터를 암호화 및 복호화합니다. 하나는 공개키로, 인터넷 상에서 공개되어 있으며, 다른 하나는 개인키로, 해당 키를 가진 사용자만 알고 있습니다.


SSL 및 TLS는 데이터 전송의 안전성을 보장하기 위해 데이터의 암호화뿐 아니라 인증 및 무결성 검사도 수행합니다. 이를 통해 데이터의 안전성을 보장할 수 있습니다.

예를 들어, 사용자가 인터넷 뱅킹 서비스를 이용하여 자신의 계좌 정보를 확인하는 경우, SSL 또는 TLS 프로토콜을 통해 데이터가 암호화되어 전송됩니다. 이러한 방식으로 데이터의 안전성을 보장할 수 있습니다.


SSL/TLS를 사용하여 안전한 인터넷 통신 시 이해해야 할 기본 개념


  • 인증서(Certificates): SSL/TLS 인증서는 클라이언트와 서버 간 신뢰를 수립하는 데 사용됩니다. 인증서에는 서버의 신원 정보가 포함되며, 신뢰할 수 있는 제3자(인증 기관)에 의해 서명되어 진짜임을 인증합니다.
  • 핸드셰이크(Handshake): SSL/TLS 핸드셰이크 과정에서 클라이언트와 서버는 안전한 연결을 위한 암호화 알고리즘과 다른 매개변수를 협상하기 위해 정보를 교환합니다.
  • 암호화(Encryption): 안전한 연결이 설정되면, 약속된 암호화 알고리즘을 사용하여 데이터가 암호화되어 클라이언트와 서버 간 안전하게 전송됩니다.

SSL/TLS 핸드셰이크 과정에서 사용되는 암호화 알고리즘에는 RSA, Diffie-Hellman, ECDH 등이 있습니다.


RSA 암호화 알고리즘공개키 암호화 방식으로, 공개키와 개인키를 사용하여 메시지를 암호화 및 복호화합니다. RSA는 안전한 키 교환 및 디지털 서명 등 다양한 용도로 사용됩니다.


Diffie-Hellman 암호화 알고리즘공유 비밀키 암호화 방식으로, 두 당사자 간에 안전하게 비밀키를 공유하기 위해 사용됩니다. Diffie-Hellman은 대칭키 암호화에서 중요한 역할을 합니다.


ECDH 암호화 알고리즘타원 곡선 기반의 공개키 암호화 방식으로, Diffie-Hellman과 유사한 방식으로 비밀키를 공유합니다. ECDH는 RSA와 비교하여 계산 비용이 적고, 보안성이 높습니다.


가장 많이 사용되는 SSL/TLS 암호화 알고리즘RSA 및 ECDH 기반의 알고리즘입니다. 이들 알고리즘은 대부분의 브라우저와 서버에서 지원되며, 안전하고 효과적인 인터넷 통신을 위해 사용됩니다.


💡 공개키 암호화 방식

공개키 암호화 방식은 두 개의 키를 사용하여 데이터를 암호화 및 복호화하는 방식입니다.

예를 들어, 사용자 A가 사용자 B에게 보낼 데이터를 암호화할 때, A는 B의 공개키를 사용하여 데이터를 암호화합니다. 그리고 B가 이 데이터를 받게 되면, B는 자신의 개인키를 사용하여 데이터를 복호화합니다. 이렇게 함으로써, A는 B만이 이 데이터를 읽을 수 있도록 보호할 수 있습니다.

이와 같은 방식으로, 공개키 암호화 방식은 데이터의 안전성을 보장하기 위한 중요한 방법 중 하나입니다.


자바에서 공개키 암호화 방식을 이용하여 데이터를 교환하는 코드의 예시입니다.

import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import javax.crypto.Cipher;

public class RSAEncryptionExample {
    public static void main(String[] args) throws Exception {
        // Bob과 Alice의 공개키와 개인키를 생성합니다.
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        SecureRandom secureRandom = new SecureRandom();
        keyPairGenerator.initialize(2048, secureRandom);
        KeyPair bobKeyPair = keyPairGenerator.generateKeyPair();
        KeyPair aliceKeyPair = keyPairGenerator.generateKeyPair();
        PublicKey alicePublicKey = aliceKeyPair.getPublic();
        PrivateKey alicePrivateKey = aliceKeyPair.getPrivate();

        // Bob은 Alice의 공개키를 사용하여 데이터를 암호화합니다.
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, alicePublicKey);
        byte[] message = "Hello, Alice!".getBytes();
        byte[] encryptedMessage = cipher.doFinal(message);

        // Alice는 자신의 개인키를 사용하여 데이터를 복호화합니다.
        cipher.init(Cipher.DECRYPT_MODE, alicePrivateKey);
        byte[] decryptedMessage = cipher.doFinal(encryptedMessage);

        // 결과를 출력합니다.
        System.out.println("Original Message: " + new String(message));
        System.out.println("Encrypted Message: " + new String(encryptedMessage));
        System.out.println("Decrypted Message: " + new String(decryptedMessage));
    }
}

위의 코드는 Java에서 공개키 암호화 방식을 이용하여 데이터를 교환하는 예시입니다. Bob과 Alice의 공개키와 개인키를 생성하고, Bob은 Alice의 공개키를 사용하여 데이터를 암호화합니다. Alice는 자신의 개인키를 사용하여 데이터를 복호화합니다. 이를 통해, Bob은 Alice만이 이 데이터를 읽을 수 있도록 보호할 수 있습니다.

참고

0개의 댓글