기타/기타

대칭키 암호화 vs 공개키 암호화

시뻘건 튼튼발자 2024. 8. 29. 00:04
반응형

1. 대칭키 암호화

대칭키 암호화는 같은 키로 암호화와 복호화를 수행하며, 빠르고 효율적이지만 키 관리가 어렵다.

  • 키 구조: 암호화와 복호화에 동일한 키를 사용한다.
  • 작동 원리: 데이터를 암호화할 때 사용한 키와 동일한 키로 데이터를 복호화한다. 즉, 데이터 송신자와 수신자가 동일한 키를 공유해야 한다.
  • 장점: 비교적 빠르고 효율적이다. 대용량 데이터를 암호화할 때 성능이 뛰어나므로 실시간 통신이나 대규모 데이터 전송에 자주 사용된다.
  • 단점: 키가 노출되면 제3자가 데이터를 쉽게 복호화할 수 있기 때문에 키를 안전하게 전달하고 관리하는 것이 어려울 수 있다.
  • 종류: AES, DES 등

2. 공개키 암호화

공개키 암호화는 서로 다른 키로 암호화와 복호화를 수행하며, 보안성이 높지만 처리 속도가 느리다. 주로 키 교환이나 인증에 사용된다.

  • 키 구조: 공개키(Public Key)와 비밀키(Private Key) 두 개의 키를 사용한다. 
  • 작동 원리: 한 쌍의 키 중 하나로 데이터를 암호화하면, 다른 하나의 키로만 복호화할 수 있다. 일반적으로 공개키로 데이터를 암호화하고, 비밀키로 복호화한다. 공개키는 누구나 접근 가능하지만, 비밀키는 오직 소유자만이 알고 있다.
  • 장점: 키를 안전하게 전달할 필요가 없다. 공개키는 누구와도 공유할 수 있지만, 비밀키는 외부에 노출되지 않으므로 보안이 강화된다. 이를 통해 안전하게 비밀 통신을 할 수 있으며, 디지털 서명과 같은 추가적인 기능도 제공된다.
  • 단점: 대칭키 암호화에 비해 계산 복잡도가 높아 암호화 및 복호화 속도가 느리다.
  • 종류: RSA, ECC 등

 

현업에서 두 암호화 모드 사용해보았다. 대칭키 암호화 방식은 AES256 암호화를 사용했다. 나는 B2B 사업 아이템을 개발할 때 사용했기 때문에 항상 협력사와 키를 주고 받을 때 USB에 키를 넣어서 주고받았다.

공개키 암호화의 경우에는 github에서도 사용하고 JWT를 생성할 때도 사용했다. jwt를 생성할 때는 HMAC을 사용했다.

 

HMAC

HMAC은 메시지 인증 코드를 생성하기 위해 사용되는 알고리즘이다. 주어진 메시지가 변조되지 않았음을 확인하고, 메시지의 무결성을 보장하기 위해 사용된다.

  • 작동 원리:
    • HMAC은 특정 해시 함수(예: SHA-256)와 비밀 키를 결합하여 고유한 해시 값을 생성한다.
    • 송신자는 메시지와 함께 HMAC 값을 전송하고, 수신자는 동일한 비밀 키를 사용해 HMAC을 계산하여 받은 값과 비교한다.
    • 일치할 경우, 메시지가 변조되지 않았음을 확인할 수 있다.

 

예전에 사용했던 나의 코드를 첨부해본다.

public class JwtSupport {
  private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
  private static final SecretKey HMAC_SHA_KEY = Keys.hmacShaKeyFor(SECRET_KEY.getEncoded());
  
    private static String generateJwt(final Duration expirationDuration)
      throws JsonProcessingException {

    return Jwts.builder()
        .setIssuedAt(Date.from(now))
        .setExpiration(Date.from(expirationTime))
        .signWith(HMAC_SHA_KEY, SignatureAlgorithm.HS256)
        // ...
        .compact();
  }
  
  // ...
  
}

 

반응형