암호화 어떻게 하시나요?


안녕하세요. 아직 학생입니다.

요즘 암호화 구현에 관심이 있는데요. JCA로 양방향 암호화 구현에 대해 생각해 봤는데요.

첫번째. 매 통신마다 서버에서 공개키를 클라이언트에 보내고 비밀키는 DB에 저장해놓았다가 클라이언트단에서 암호화된 문장이 날라오면 DB에 있던 비밀키로 해독하는 방식

두번째. 공개키-비밀키 1000개쯤 테이블을 미리 만들어 약속해 두고 통신시 인덱스만 주고 받고 하면 앤드포인트 단에서 테이블보고 알아서 암호화 복호화.

이런 방법이 잘 쓰이는 방법인가요?

그리고 궁금한게 비밀번호가 있는 패킷 하나 물고늘어져서 1년이 걸리든 암호문 해독하면 거기 비밀번호 뚫리는데 그건 어떡하나요?

신문기사를 검색해보았습니다. "이를 위해 텔레그램은 보안기술로 256비트 AES(Advanced Encryption Standard) 알고리즘과 RSA(Rivest Shamir Adleman) 2048 시스템, 디피-헬맨(Diffie-Hellman) 방식을 사용하고 있다." 근데 RSA는 양방향이고 AES는 단방향인데 둘이 공존할 수 있나요?

감사합니다.

  • 2016년 03월 31일에 작성됨
    개발을 공부하는 학생 ANDROID / IOS / JSP / VB.NET / AWS

  • RSA 연산은 큰수에 대한 연산을하게 되는데, 여기에 사용되는 연산이 CPU를 제법 잡아 먹습니다. 그래서 보호하려는 데이터가 길어지면 암호화에 사용되는 부하가 너무 심해집니다. 상대적으로 대칭키 방식인 AES는 연산 속도가 상당히 빠릅니다. 이러한 장점을 살려서 실제 데이터 암복호는 AES를 이용하되, 이에 사용되었던 대칭키를 RSA 암호화를 이용하여 전송하면, 수신자 측에서 RSA 복호화로 AES 키를 획득하고, 이 키로 데이터를 복호화하여 쓰게 됩니다. (아주 일반적인 방식입니다)    박종진   2016.3.31 17:34     
  • 의미 있는 시간내에 풀리지 않는다는 보장하에 사용하는 알고리즘이기 때문에 시간이 흐르면 암호화는 해독이 가능합니다, 그래서 비밀번호를 주로 바꾸라고 사이트에서 권고하기도 하며, 인증서 같은 경우도 유효기간이 설정되어 있는 것이죠.    박종진   2016.3.31 17:37     
  • 감사합니다.    이창호   2016.3.31 21:59     
  • http://minix.tistory.com/397 이 글을 한번보세요.    허대영(Daeyoung Heo)   2016.3.31 23:41     
조회수 665


1 답변


좋아요
5
싫어요
채택취소하기

PKI(X.509 공개키 규격)에서 볼 때, 암호화는 목적이 크게 비밀통신과 위변조방지로 나눌수 있습니다.

  • 비밀통신은 말 그대로 누군가가 감청/도청하거나 통신이 방수(불특정 다수에게 알려지는 상황)되더라도, 약속된 관계자(혹은 기관)만 내용을 이해할 수 있는 것을 말합니다.
  • 반대로 위변조방지를 목적으로 암호화기술을 쓰는 경우는, 어떤 기관에 내용을 다른 누군가에게 통신을 하며 내용을 전달하는 데, 제 3자가 끼어들어 내용을 변경하여 수신자가 발신 원문이 아닌 변조된 내용을 받을 수 있는 것을 방지하고자 할 때 사용합니다. 위변조 확인은 수신자 측에서 하게 됩니다.

비밀통신: 발신자가 내용을 암호화하여 수신자만 해독할 수 있게 하는 데 목적이 있습니다. 수신자는 먼저 암호화키와 복호화키를 가져야 합니다. 그리고 통신 전에 발신자에게 암호화키를 안전하게 전달해야 하며, 이를 받은 발신자는 수신자에게 메시지를 전달할 때, 암호화키를 통해 암호화하여 수신자에게 보내면 수신자는 복호화키로 메시지를 해독할 수 있습니다. 이때, 암호화키는 다른 누군가에게 전달하여 알게됨으로 공개키에 해당하며, 복호화키는 수신자만 알아야함으로 비밀키에 해당합니다.

위변조방지: 발신자는 메시지 원문과 함께, 메시지 원문이 변조되지 않았음을 증명할 수 있는 서명(전자서명)을 첨부합니다.수신자는 발신자의 알려진 위변조대조키를 사용하여 메시지가 원본으로 부터 변조되지 않았음을 확인하면됩니다. 이때 서명을 만들 때 사용하는 키가 비밀키이며, 수신자가 사용하게되는 알려진 위변조 대조키가 공개키입니다.

위는 개념적으로 설명하기 위해서 간단히 설명한 것입니다.

이제 질문에 대한 답변으로 돌아가면..

첫번째 질문에 대한 답변

어떤 목적이든 대부분의 보안 통신은 위 둘 중에 하나에 해당하며, 질문하신 대로 하면 됩니다.

실제 SSL 통신도 이 방법을 사용합니다. 다만 실제로 서비스에서는 DB에 비밀키를 저장하거나 하지는 않고, 안전한(온라인으로 접근할 수 없는) 파일시스템에 저장해서 사용합니다.

일반적인 SSL의 경우 단방향 암호화를 사용한다고 보시면 됩니다. 서버에서 클라이언트에 공개키를 보내고, 서버가 전송하는 내용은 비밀키로 암호화(위변조방지)하는 것이며, 클라이언트가 보내는 내용은 서버의 공개키로 암호화(비밀통신)하게 됩니다.

양방향으로 비밀통신을 하려면, 양쪽다 상대방의 공개키를 가지고 있어야합니다. SSL은 여기에서 서로 키를 교환하고, 키에 대한 신뢰 과정을 포함한 연결 절차(프로토콜)를 정의한것으로 생각하시면 됩니다.

두번째 질문에 대한 답변

보안이 정말 중요하다면, 고려해볼 수는 있겠습니다만, 실제 서비스에는 그렇게 쓰는 경우는 없는 것 같습니다. 어떤 키로 암호화하고 복호화해야 하는지 알아내는 과정이 쉽지 않을 것 같고, 이것이 쉽게 가능하다면, 제 3자도 쉽게 알아낼 수 있게 됨으로 원론적으로 한개를 쓰는 것과 여러개를 쓰는것이 차이가 없습니다. 암호화 해킹을 위한 데이터 수집 기간이 더욱 길어지게 하는 효과는 있을 것 같군요.

상당한 노력을 들인 암호화 해킹

가능한 얘기입니다. 그러나 확률적으로 이를 거의 0에 가깝게 만들기 위해서 암호화에 사용하는 키의 bit수를 크게 합니다. 현재는 키의 길이를 2048bit로 권고되고 있습니다. 아마 컴퓨터의 성능이 더 좋아지고, 대체 암호화 기술이 새롭게 나타나지 않는 다면, 키의 길이가 더욱 길어지는 쪽으로 방향이 잡힐겁니다.

RSA

RSA 알고리즘이 비대칭키 알고리즘으로 공개키와 비밀키로 나누는 것입니다.

AES

보통 개인키를 암호화할 때 사용합니다. 공인인증서 쓰실 때, 인증서 암호를 넣은적이 있을 텐데, 이 때 입력한 암호가 비밀키에 걸려있는 암호화 알고리즘을 풀기위해서 사용합니다. 개인키를 암호화할 때 사용하는 대칭키 알고리즘 중 하나가 AES입니다. 따라서 공존하는 것처럼 보입니다만, AES는 비밀키를 더욱 안전하게 보관하기 위해 사용하는 것으로 보시면 됩니다. 그렇더라도 비밀키가 유출되는 경우, 충분한 시간이 지나면 해독될 수 있으므로, 애초에 온라인 상에 비밀키가 노출되지 않도록 관리를 잘해야 합니다.

(수정답변)

SSL의 실제 통신에서는 AES와 같은 대칭키 알고리즘으로 암호화하는데, 이때 이 대칭키를 상대방에게 전달하기 위해서 비대칭키로 암호화해서 전달하는 과정을 거칩니다. (위 @박종진 님의 말씀대로)

  • 2016년 06월 01일에 수정됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.
  • 2016년 03월 31일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close