암호화 원칙을 사용하여 HTTPS가 안전한 이유 설명
대칭 암호화
텍스트 부분을 암호화하려고 합니다. 프로세스는 다음과 같습니다.
일반 텍스트 "Hello World"? >
-------> ? 암호문 "gsHgw832iSI" 키 "111222"
복호화 과정은 다음과 같습니다:
암호문 "gsHgw832iSI" ?알고리즘
p>------->? 일반 텍스트 "Hello World" 키 "111222"
여기서 핵심은 암호화와 복호화가 동일한 키와 알고리즘을 갖는다는 것입니다(상호 ), 그래서 "대칭"이라고 불립니다.
가장 안전한 대칭 암호화 알고리즘: 일회용 보드
절대적으로 안전한 암호화 알고리즘이 있을까? 가지다!
일반 텍스트의 각 문자가 키의 문자를 통해 암호문의 문자에 매핑되면 키의 길이는 텍스트의 길이와 동일하며 키는 한 번만 사용되며, 그렇다면 이런 종류의 키는 "일회성 패드"라고 생생하게 불립니다.
일회용 보드의 길이는 평문과 암호문의 길이와 같고, 사용 후에는 버려야 하기 때문에 키가 중복될 수 없어 상당히 안전하고, 암호문도 깨지지 않는다. 이론. 키를 정확하게 추측하여 일반 텍스트를 얻더라도 키가 다른 것일 수도 있고 다른 종류의 일반 텍스트를 얻을 수도 있습니다. 일반 텍스트가 전자이고 후자가 아니라고 확신할 수 있습니까? ? 실제로, 암호문이 결정되면 주어진 평문은 그에 상응하는 키를 갖게 됩니다! 그러니 해킹하려고 해도 전혀 소용이 없습니다.
그러나 우리가 일반적으로 암호화해야 하는 정보의 양은 매우 크다. 1GB 파일을 암호화하려면 키도 1GB가 되어야 하기 때문에 키를 전송하고 저장하는 것이 너무 무섭다. 따라서 일회용 보드는 실용적이지 않습니다.
절충: 고정 키 길이를 사용한 대칭 암호화
키 길이가 일반 텍스트와 암호문의 길이보다 작은 알고리즘의 경우 이론적으로 해독될 수 있습니다. 이하에서 평문을 임의로 지정하는 것은 불가능하며 그에 대응하는 키가 존재한다. (동일한 키로 서로 다른 블록을 암호화해야 하기 때문에 평문이 원본 텍스트가 아니면 이를 할 수 있는 키를 찾을 수 없다.) 모든 블록에 적용됩니다.)
그러나 키 길이가 충분하다면 대략 깨지지 않는 것으로 간주할 수 있습니다. 전문가들은 112비트 키를 해독하는 데 천문학적인 시간이 걸리기 때문에 충분히 안전하다고 믿습니다. 반올림하려면 일반적으로 128비트가 사용됩니다. AES 알고리즘은 오늘날 대칭 암호화 알고리즘의 표준입니다.
큰 질문: 키를 보내는 방법
A가 B에게 기밀 문서를 보내고자 한다면 그는 반드시 키 K를 사용하여 이를 암호화할 것입니다. 그는 암호문을 B에게 먼저 보냈는데 아무런 문제가 없었다. 하지만 문제는 B가 암호를 해독할 수 있도록 키 K를 어떻게 B에게 알려줄 것인가 하는 것입니다.
열쇠를 직접 보내면 누구나 열쇠를 엿볼 수 있습니다. 그 사람이 자신이 보낸 파일을 가로채는 한, 그 파일은 해독될 수 있습니다.
키 K를 새 키로 암호화해도 괜찮나요? 물론 그렇지 않습니다. 왜냐하면 이 새 키를 어떻게 전송합니까?
이때 A는 마침내 키를 USB 디스크에 저장해 B에게 직접 건네주는 방법을 알아냈다. 이는 좋은 방법이며 키 전송 문제를 "해결"합니다. 그런데 곰곰이 생각해 보면 USB 디스크에 직접 파일을 B로 넣을 수도 있는데 왜 암호화해서 이렇게 번거롭게 만드는 걸까요? 하지만 가장 중요한 것은 오늘날의 세계에서도 정보를 전달하기 위해 여전히 사람들이 모여야 한다면 이는 원시 시대로의 회귀가 아닐까?
이것은 유명한 문제입니다: 키 교환 문제입니다. 이 문제를 해결할 방법이 없는 것 같습니다.
그때까지 비대칭 암호화 알고리즘이 등장했습니다.
비대칭 암호화
암호화와 복호화에 사용되는 키가 다른(즉, 비대칭) 알고리즘이 있다면, 키 교환 문제를 해결할 수 있을까요?
답은 그렇습니다. B는 먼저 암호화 키를 A에게 보낸 다음 A가 파일을 암호화한 다음 A가 B에게 암호문을 보내고 마지막으로 B는 암호 해독 키를 사용하여 암호를 해독합니다. 모든 과정은 매우 완벽했습니다. 암호화 키는 암호화에만 사용할 수 있기 때문에 키를 가로채더라도 파일이 해독되지는 않습니다.
따라서 암호화 키를 "공개 키", 복호화 키를 "개인 키"라고 부를 수 있습니다.
그러나 잘 생각해보면 이 메커니즘은 알고리즘에 대한 요구 사항이 매우 높습니다.
공개 키와 개인 키는 특정 기능을 통해 일대일로 대응해야 합니다.
그런데 공개키를 통해 개인키를 직접 얻는 것은 굉장히 어려울 것 같아요.
소수를 사용하는 알고리즘은 이러한 요구 사항을 충족하는 가장 간단한 알고리즘입니다. 이는 다음과 같은 수학적 원리에 기초합니다. 두 개의 큰 소수가 주어지면 곱을 찾기는 쉽지만 곱을 알면 어떤 두 소수가 곱해지는지 알아내는 것은 극히 어렵습니다. (인간은 빠른 방법을 찾지 못했습니다.) 하나씩만 시도할 수 있습니다.) 예를 들어, 컴퓨터가 다음과 같은 큰 합계를 분해한다고 가정해 보겠습니다. 7936943673922808872755445627854565536638199×40094690950920881030683735292761468389214899724061
소수를 통해 제품을 찾으면 모든 컴퓨터에서 1마이크로초 이내에 완료할 수 있습니다. 분해해 보면, 시간이 오래 걸립니다. 이는 330자리(십진수 100자리)의 합성수에 불과하다. RSA 알고리즘에 사용되는 실제 큰 합성수는 분해가 완료되기까지 수백억년이 걸리므로 매우 안전하다. .
상상해 보세요. 두 개의 큰 소수를 개인 키로 간주하고 그 결과를 공개 키로 간주하면 해당 암호화 및 암호 해독 알고리즘이 있는 한 키 교환 문제를 해결할 수 있습니다. RSA의 원리는 이 이론을 기반으로 하며 구체적인 구현은 약간 더 복잡합니다(공개 키와 개인 키는 이 방법을 통해 직접 얻을 수 없으며 일부 변환을 거쳐야 하므로 여기서는 논의하지 않습니다).
그런데 이런 키 교환에는 정말 문제가 없나요? 아니요!
디지털 서명
아직 해결되지 않은 매우 중요한 문제가 있습니다. 즉, 공개 키를 A에게 보낸 사람이 B임을 누가 증명할 수 있습니까? 누구든지 B를 가장할 수 있다면 A는 쉽게 속을 것입니다. A는 다른 사람의 공개 키를 사용하여 암호화한 후 B에게 보낼 수 있으며, 전송 과정에서 다른 사람이 가로챌 수 있습니다. 그 결과 B는 파일을 읽을 수 없게 되었고, 악의적인 의도를 가진 누군가가 파일을 복호화하게 되었다.
인생에서 오랜 역사를 지닌 '시그니처'를 흉내 내는 것이 필요한 것 같다.
먼저 전통 서명의 특징을 살펴보겠습니다.
서명자 본인만이 이름(패턴)에 서명할 수 있습니다.
외부인은 흉내낼 수 없지만 확인할 수는 있다. 흉내내기는 어렵지만 확인하기는 쉽습니다.
비대칭암호를 생각하시나요? “순방향은 쉽지만 역방향은 어렵다”는 것이 비대칭 암호화의 특징이 아닐까요? 전통적인 비대칭 암호화는 "공개키 암호화, 개인키 복호화"이다. 그 반대가 되어 "개인 키 암호화, 공개 키 복호화"가 된다면 이것이 완벽하게 일치한다는 사실에 우리는 놀랐습니다.
서명자 자신만이 정보를 암호화하여 정보에 서명할 수 있습니다. 개인 키로.
공개키로 복호화하면 외부인이 확인할 수 있고, 복호화에 성공하면 확인, 그렇지 않으면 위조된 것이다.
이것은 디지털 서명입니다.
이 시점에서 마지막 링크만 남았습니다. 즉, 공개 키가 B를 나타낸다는 것을 누가 증명할 것인가? 각 공개키가 누구를 대표하는지 모두에게 알려줄 수 있는 권위 있는 기관을 도입해야 의미 있는 검사가 될 것으로 보인다.
이것은 암호화 분야에서 가장 복잡한 문제로, 사람들이 "디지털 인증서"와 "공개 키 인프라"라는 기발한 아이디어를 제안하게 되었습니다.
디지털 인증서, 공개 키 인프라
이러한 권위 있는 조직을 CA(인증 기관)라고 합니다. 이들의 책임은 각 공개 키가 누구인지 증명하는 인증서를 발급하는 것입니다. 여기서 "누구"는 개인, 조직 또는 다른 CA일 수 있습니다. 이런 식으로 거대한 '공개 키 인프라(PKI)'가 형성될 수 있다.
?루트 CA ? |
?------
?| 레벨 2 CA ? | 레벨 3 CA ? |
/p>
? |
?개인
각 인증서에 다음 내용이 포함된다고 상상해 보세요:
제목(발급자의 공개 키 및 발급자의 공개 키)
발급자는 개인 키를 사용하여 주체에 디지털 서명을 합니다.
이런 방식으로 루트 CA가 결정되는 한 거대한 신뢰 체인이 형성됩니다. 설립되었습니다.
루트 CA에 해당하는 인증서를 루트 인증서라고 하며, 운영체제 제조사가 인위적으로 설정한 인증서입니다. Windows, macOS 및 Linux에는 기본적으로 신뢰되는 루트 CA가 수십에서 수백 개 있습니다.
소프트웨어를 개발할 때 자체적으로 루트 CA를 구축할 수도 있습니다. 그 방법은 발급자의 공개 키를 동일하게 만드는 것입니다. -서명된 인증서")가 운영 체제에서 루트 인증서로 인식되면 운영 체제에 "인증서를 신뢰"하도록 지시해야 합니다. 그러나 이런 종류의 인증서를 낯선 사람에게 보내지 말고 그에게 클릭하여 인증서를 신뢰하도록 요청하지 마십시오. 왜냐하면 이는 다른 사람들에게 위험하기 때문입니다.
HTTPS
마지막으로 HTTPS로 돌아갈 수 있습니다. HTTPS의 세부 사항을 이해하는 것은 프로그래머에게 별 의미가 없습니다. 중요한 것은 위의 장을 통해 마침내 HTTPS의 보안이 기술적으로 보장된다는 것을 믿을 수 있다는 것입니다. 사람들은 자신이 방문하는 웹사이트가 실제로 이 웹사이트이고 해커가 사칭한 웹사이트가 아니라는 것을 확신할 수 있습니다. 또한 전송되는 모든 데이터는 암호화되어 외부인이 읽을 수 없다는 점을 확신할 수 있습니다.
CA는 웹사이트에 인증서를 어떻게 발급하나요? 먼저 컴퓨터에서 개인 키와 공개 키를 생성하고 공개 키를 CA에 보낸 다음 CA는 귀하가 웹사이트의 소유자인지 확인합니다.
보내기 방법은 다음과 같습니다. webmaster@으로 이메일을 보내주세요. 도메인 이름.com 또는 postmaster@도메인 이름.com을 수신할 수 있으면 해당 웹사이트의 소유자임을 증명합니다.
웹사이트의 특정 디렉토리에 파일을 추가할 수 있으면 귀하가 웹사이트의 소유자임을 증명합니다.
도메인 이름의 DNS에 항목을 추가할 수 있으며, 이를 통해 가능한 경우 귀하가 웹사이트의 소유자임을 증명할 수 있습니다.
인증 후 CA에서 인증서를 발급해 드립니다.
성능 최적화
비대칭 암호화는 대칭 암호화보다 100배(소프트웨어 구현) 또는 1000배(하드웨어 구현) 느립니다. 위의 암호화, 복호화 및 서명 방법만 사용하면 성능이 매우 저하됩니다. 암호화의 또 다른 도구인 해시가 사용되는 곳입니다.
해시는 지문, 다이제스트, 해시, 체크섬, 해시 등 많은 동의어를 가지고 있습니다. 이는 매우 적은 정보를 사용하여 많은 양의 정보와 "동등"하게 만드는 수학적 방법을 나타냅니다. 이상하게 들리겠지만, 생각해보면 지문에도 이런 특성이 있지 않나요? 지문을 통해서도 사람을 식별할 수 있고, 반대로 사람을 통해서도 지문을 식별할 수 있습니다. 이것의 장점은 지문에 담긴 정보의 양이 한 사람이 담고 있는 정보의 양에 비해 훨씬 적다는 것입니다(그래도 천문학적인 양이므로 중복되지는 않습니다).
예를 들어 다음 텍스트의 해시를 계산합니다. 해시 함수는 임의 크기의 데이터를 고정 크기의 데이터에 매핑하는 데 사용할 수 있는 함수입니다. 해시 값, 해시 코드, 다이제스트 또는 단순히 해시라고 불리는 해시 테이블이라는 데이터 구조는 빠른 데이터 조회를 위해 컴퓨터 소프트웨어에서 널리 사용됩니다. 해시 기능은 대용량 파일에서 중복된 레코드를 감지하여 테이블이나 데이터베이스 조회를 가속화합니다. 예를 들어 DNA 서열에서 유사한 스트레치를 찾는 것이 암호화 해시 기능을 사용하면 일부 입력 데이터가 지정된 해시 값에 매핑되는지 쉽게 확인할 수 있지만 입력 데이터를 알 수 없는 경우 의도적으로 어렵습니다. 저장된 해시 값을 알고 이를 재구성하거나 이에 상응하는 대안을 사용합니다. 이는 전송된 데이터의 무결성을 보장하는 데 사용되며 메시지 인증을 제공하는 HMAC의 구성 요소입니다.
SHA-256 해시 사용 결과 해시는 다음과 같습니다. 4da07b60cb90742026d7fd9ece673bfad677422e8261c1cc29ff00d0d6be4b7a
입력 데이터가 아무리 크더라도 100GB라도 SHA-256 값은 항상 256비트(16진수 64비트)입니다. 해시 알고리즘은 비대칭 암호화보다 훨씬 빠르므로 실제 응용에서는 전체 정보에 서명하는 대신 정보를 먼저 해시한 다음 해시에 서명합니다. 이는 안전을 손상시키지 않으면서 프로세스 속도를 크게 향상시킵니다.