1.TLS 详解
2.Diffie-Hellman密钥交换算法
3.ç¨WireSharkç®åççSSL/TLSåè®®
4.NodeJS加解密之Crypto
5.深入浅出 SSL/TLS 协议
6.HTTPS中的解加解密钥交换协议
TLS 详解
SSL(Secure Sockets Layer) å®å ¨å¥æ¥å±ï¼æ¯ä¸ç§å®å ¨åè®®ï¼ç»åäº SSL 1.0ã2.0ã3.0 çæ¬ååå±æäºæ åå®å ¨åè®® - TLS(Transport Layer Security) ä¼ è¾å±å®å ¨æ§åè®®ãTLS æ 1.0 (RFC )ã1.1(RFC )ã1.2(RFC )ã1.3(RFC ) çæ¬ãTLS å¨å®ç°ä¸å为 è®°å½å±å æ¡æå±ä¸¤å±ï¼å ¶ä¸æ¡æå±åå«å个ååè®®: æ¡æåè®® (handshake protocol)ãæ´æ¹å å¯è§èåè®® (change cipher spec protocol)ãåºç¨æ°æ®åè®® (application data protocol) åè¦ååè®® (alert protocol)
åªéé ç½®æµè§å¨åæå¡å¨ç¸å ³è®¾ç½®å¼å¯ TLSï¼å³å¯å®ç° HTTPSï¼TLS é«åº¦è§£è¦ï¼å¯è£ å¯å¸ï¼ä¸ä¸å±é«çº§åºç¨å±åè®®ç¸äºåä½åç¸äºç¬ç«ã
TLS/SSL çåè½å®ç°ä¸»è¦ä¾èµäºä¸ç±»åºæ¬ç®æ³ï¼æ£åå½æ° Hashã对称å å¯åé对称å å¯ï¼å ¶å©ç¨é对称å å¯å®ç°èº«ä»½è®¤è¯åå¯é¥ååï¼å¯¹ç§°å å¯ç®æ³éç¨ååçå¯é¥å¯¹æ°æ®å å¯ï¼åºäºæ£åå½æ°éªè¯ä¿¡æ¯çå®æ´æ§ã
TLS çåºæ¬å·¥ä½æ¹å¼æ¯ï¼å®¢æ·ç«¯ä½¿ç¨é对称å å¯ä¸æå¡å¨è¿è¡éä¿¡ï¼å®ç°èº«ä»½éªè¯å¹¶åå对称å å¯ä½¿ç¨çå¯é¥ï¼ç¶å对称å å¯ç®æ³éç¨ååå¯é¥å¯¹ä¿¡æ¯ä»¥åä¿¡æ¯æè¦è¿è¡å å¯éä¿¡ï¼ä¸åçèç¹ä¹é´éç¨ç对称å¯é¥ä¸åï¼ä»èå¯ä»¥ä¿è¯ä¿¡æ¯åªè½éä¿¡åæ¹è·åã
ä¾å¦ï¼å¨ HTTPS åè®®ä¸ï¼å®¢æ·ç«¯ååºè¯·æ±ï¼æå¡ç«¯ä¼å°å ¬é¥åç»å®¢æ·ç«¯ï¼å®¢æ·ç«¯éªè¯è¿åçæä¸ä¸ªå¯é¥åç¨å ¬é¥å å¯ååéç»æå¡ç«¯ï¼é对称å å¯ï¼ï¼åæ¹ä¼å¨ TLS æ¡æè¿ç¨ä¸çæä¸ä¸ªååå¯é¥ï¼å¯¹ç§°å¯é¥ï¼ï¼æåå建ç«å å¯è¿æ¥ãéä¿¡è¿ç¨ä¸å®¢æ·ç«¯å°è¯·æ±æ°æ®ç¨ååå¯é¥å å¯ååéï¼æå¡ç«¯ä¹ç¨ååå¯é¥è§£å¯ï¼ååºä¹ç¨ç¸åçååå¯é¥ãåç»çé信使ç¨å¯¹ç§°å å¯æ¯å 为对称å 解å¯å¿«ï¼èæ¡æè¿ç¨ä¸é对称å å¯å¯ä»¥ä¿è¯å å¯çæææ§ï¼ä½æ¯è¿ç¨å¤æï¼è®¡ç®éç¸å¯¹æ¥è¯´ä¹å¤§ã
è®°å½åè®®è´è´£å¨ä¼ è¾è¿æ¥ä¸äº¤æ¢çææåºå±æ¶æ¯ï¼å¹¶ä¸å¯ä»¥é ç½®å å¯ãæ¯ä¸æ¡ TLS è®°å½ä»¥ä¸ä¸ªçæ 头å¼å§ãæ 头å å«è®°å½å 容çç±»å (æååè®®)ãåè®®çæ¬åé¿åº¦ãåå§æ¶æ¯ç»è¿å段 (æè å并)ãå缩ãæ·»å 认è¯ç ãå å¯è½¬ä¸º TLS è®°å½çæ°æ®é¨åã
è®°å½å±å°ä¿¡æ¯ååå²ææºå¸¦ 2^ åè (KB) ææ´å°åçæ°æ®ç TLSPlaintext è®°å½ã
è®°å½åè®®ä¼ è¾ç±å ¶ä»åè®®å±æ交ç»å®çä¸éææ°æ®ç¼å²åºãå¦æç¼å²åºè¶ è¿è®°å½çé¿åº¦éå¶ï¼2^ï¼ï¼è®°å½åè®®ä¼å°å ¶ååææ´å°çç段ãåè¿æ¥ä¹æ¯å¯è½çï¼å±äºåä¸ä¸ªååè®®çå°ç¼å²åºä¹å¯ä»¥ç»åæä¸ä¸ªåç¬çè®°å½ã
å缩ç®æ³å° TLSPlaintext ç»æ转æ¢ä¸º TLSCompressed ç»æãå¦æå®ä¹ CompressionMethod 为 null 表示ä¸å缩
æµå å¯ï¼BulkCipherAlgorithmï¼å° TLSCompressed.fragment ç»æ转æ¢ä¸ºæµ TLSCiphertext.fragment ç»æ
MAC 产çæ¹æ³å¦ä¸ï¼
seq_numï¼è®°å½çåºåå·ï¼ãhashï¼SecurityParameters.mac_algorithm æå®çåå¸ç®æ³ï¼
åå å¯ï¼å¦ RC2 æ DESï¼ï¼å° TLSCompressed.fragment ç»æ转æ¢ä¸ºå TLSCiphertext.fragment ç»æ
padding: æ·»å çå¡«å å°ææé¿åº¦å¼ºå¶ä¸ºåå¯ç åé¿åº¦çæ´æ°åãå¡«å å¯ä»¥æ¯é¿è¾¾ åèçä»»ä½é¿åº¦ï¼åªè¦æ»¡è¶³ TLSCiphertext.length æ¯åé¿åº¦çæ´æ°åãé¿åº¦å¤§äºéè¦çå¼å¯ä»¥é»æ¢åºäºåæ交æ¢ä¿¡æ¯é¿åº¦çåè®®æ»å»ãå¡«å æ°æ®åéä¸çæ¯ä¸ª uint8 å¿ é¡»å¡«å ¥å¡«å é¿åº¦å¼ (å³ padding_length)ã
padding_length: å¡«å é¿åº¦åºè¯¥ä½¿å¾ GenericBlockCipher ç»æçæ»å¤§å°æ¯å å¯åé¿åº¦çåæ°ãåæ³å¼èå´ä»é¶å° ï¼å«ï¼ã该é¿åº¦æå® padding_length å段æ¬èº«é¤å¤çå¡«å å段çé¿åº¦
å å¯åçæ°æ®é¿åº¦ï¼TLSCiphertext.lengthï¼æ¯ TLSCompressed.lengthï¼CipherSpec.hash_size å padding_length çæ»åå ä¸
å å¯å MAC åè½å° TLSCompressed ç»æ转æ¢ä¸º TLSCiphertextãè®°å½ç MAC è¿å æ¬åºåå·ï¼ä»¥ä¾¿å¯ä»¥æ£æµå°ä¸¢å¤±ï¼é¢å¤æéå¤çæ¶æ¯ã
è®°å½åè®®éè¦ä¸ç§ç®æ³ï¼ä»æ¡æåè®®æä¾çå®å ¨æ§åæ°çæå¯é¥ã IV å MAC secret.
主å¯é¥ (Master secret): å¨è¿æ¥ä¸åæ¹å ±äº«çä¸ä¸ª åèçå¯é¥
客æ·éæºæ° (client random): ç±å®¢æ·ç«¯æä¾ç åèå¼
æå¡å¨éæºæ° (server random): ç±æå¡å¨æä¾ç åèå¼
æ¡ææ¯ TLS åè®®ä¸æç²¾å¯å¤æçé¨åãå¨è¿ä¸ªè¿ç¨ä¸ï¼éä¿¡åæ¹ååè¿æ¥åæ°ï¼å¹¶ä¸å®æ身 份éªè¯ãæ ¹æ®ä½¿ç¨çåè½çä¸åï¼æ´ä¸ªè¿ç¨é常éè¦äº¤æ¢ 6~ æ¡æ¶æ¯ãæ ¹æ®é ç½®åæ¯æçåè®®æ©å±çä¸åï¼äº¤æ¢è¿ç¨å¯è½æ许å¤åç§ãå¨ä½¿ç¨ä¸ç»å¸¸å¯ä»¥è§å¯å°ä»¥ä¸ä¸ç§æµç¨ï¼(1) å®æ´çæ¡æï¼ å¯¹æå¡å¨è¿è¡èº«ä»½éªè¯ï¼(2) æ¢å¤ä¹åçä¼è¯éç¨çç®çæ¡æï¼(3) 对客æ·ç«¯åæå¡å¨é½è¿è¡èº«ä»½éªè¯çæ¡æã
æ¡æåè®®æ¶æ¯çæ 头信æ¯å å«æ¶æ¯ç±»åï¼1 åèï¼åé¿åº¦ï¼3 åèï¼ï¼ä½ä¸çä¿¡æ¯ååå³äºæ¶æ¯ç±»åï¼
æ¯ä¸ä¸ª TLS è¿æ¥é½ä¼ä»¥æ¡æå¼å§ãå¦æ客æ·ç«¯æ¤å并æªä¸æå¡å¨å»ºç«ä¼è¯ï¼é£ä¹åæ¹ä¼æ§è¡ä¸æ¬¡å®æ´çæ¡ææµç¨æ¥åå TLS ä¼è¯ãæ¡æè¿ç¨ä¸ï¼å®¢æ·ç«¯åæå¡å¨å°è¿è¡ä»¥ä¸å个主è¦æ¥éª¤:
ä¸é¢ä»ç»æ常è§çæ¡æè§åï¼ä¸ç§ä¸éè¦éªè¯å®¢æ·ç«¯èº«ä»½ä½éè¦éªè¯æå¡å¨èº«ä»½çæ¡æ:
è¿æ¡æ¶æ¯å°å®¢æ·ç«¯çåè½åé¦éé¡¹ä¼ éç»æå¡å¨ã
æ¯å°æå¡å¨éæ©çè¿æ¥åæ°ä¼ å客æ·ç«¯ã
è¿ä¸ªæ¶æ¯çç»æä¸ ClientHello 类似ï¼åªæ¯æ¯ä¸ªå段åªå å«ä¸ä¸ªé项ï¼å ¶ä¸å å«æå¡ç«¯ç random_S åæ° (ç¨äºåç»çå¯é¥åå)ãæå¡å¨æ éæ¯æ客æ·ç«¯æ¯æçæä½³çæ¬ãå¦ææå¡å¨ä¸æ¯æä¸å®¢æ·ç«¯ç¸åççæ¬ï¼å¯ä»¥æä¾æä¸ªå ¶ä»çæ¬ä»¥æå¾ å®¢æ·ç«¯è½å¤æ¥å
å¾ä¸ç Cipher Suite æ¯åç»å¯é¥ååå身份éªè¯è¦ç¨çå å¯å¥ä»¶ï¼æ¤å¤éæ©çå¯é¥äº¤æ¢ä¸ç¾åç®æ³æ¯ ECDHE_RSAï¼å¯¹ç§°å å¯ç®æ³æ¯ AES-GCMï¼åé¢ä¼è®²å°è¿ä¸ª
è¿æä¸ç¹é»è®¤æ åµä¸ TLS å缩é½æ¯å ³éçï¼å 为 CRIME æ»å»ä¼å©ç¨ TLS å缩æ¢å¤å å¯è®¤è¯ cookieï¼å®ç°ä¼è¯å«æï¼èä¸ä¸è¬é ç½® gzip çå 容å缩ååå缩 TLS åçæçä¸å¤§åé¢å¤å ç¨èµæºï¼æ以ä¸è¬é½å ³é TLS å缩
å ¸åç Certificate æ¶æ¯ç¨äºæºå¸¦æå¡å¨ X. è¯ä¹¦é¾ ã
æå¡å¨å¿ é¡»ä¿è¯å®åéçè¯ä¹¦ä¸éæ©çç®æ³å¥ä»¶ä¸è´ãæ¯æ¹è¯´ï¼å ¬é¥ç®æ³ä¸å¥ä»¶ä¸ä½¿ç¨çå¿ é¡»å¹é ãé¤æ¤ä»¥å¤ï¼ä¸äºå¯é¥äº¤æ¢ç®æ³ä¾èµåµå ¥è¯ä¹¦çç¹å®æ°æ®ï¼èä¸è¦æ±è¯ä¹¦å¿ 须以客æ·ç«¯æ¯æçç®æ³ç¾åãææè¿äºé½è¡¨ææå¡å¨éè¦é ç½®å¤ä¸ªè¯ä¹¦ï¼æ¯ä¸ªè¯ä¹¦å¯è½ä¼é å¤ä¸åçè¯ä¹¦é¾ï¼ã
Certificate æ¶æ¯æ¯å¯éçï¼å 为并éææå¥ä»¶é½ä½¿ç¨èº«ä»½éªè¯ï¼ä¹å¹¶éææ身份éªè¯æ¹æ³é½éè¦è¯ä¹¦ãæ´è¿ä¸æ¥è¯´ï¼è½ç¶æ¶æ¯é»è®¤ä½¿ç¨ X. è¯ä¹¦ï¼ä½æ¯ä¹å¯ä»¥æºå¸¦å ¶ä»å½¢å¼çæ å¿ï¼ä¸äºå¥ä»¶å°±ä¾èµ PGP å¯é¥
æºå¸¦å¯é¥äº¤æ¢éè¦çé¢å¤æ°æ®ãServerKeyExchange æ¯å¯éçï¼æ¶æ¯å 容对äºä¸åçååç®æ³å¥ä»¶ä¼åå¨å·®å¼ãé¨ååºæ¯ä¸ï¼æ¯å¦ä½¿ç¨ RSA ç®æ³æ¶ï¼æå¡å¨ä¸éè¦åéæ¤æ¶æ¯ã
ServerKeyExchange ä» å¨æå¡å¨è¯ä¹¦æ¶æ¯ï¼ä¹å°±æ¯ä¸è¿° Certificate æ¶æ¯ï¼ä¸å å«è¶³å¤çæ°æ®ä»¥å 许客æ·ç«¯äº¤æ¢é¢ä¸»å¯é¥ï¼premaster secretï¼æ¶æç±æå¡å¨åéã
æ¯å¦åºäº DH ç®æ³çæ¡æè¿ç¨ä¸ï¼éè¦åç¬åéä¸æ¡ ServerKeyExchange æ¶æ¯å¸¦ä¸ DH åæ°:
表ææå¡å¨å·²ç»å°ææé¢è®¡çæ¡ææ¶æ¯åéå®æ¯ãå¨æ¤ä¹åï¼æå¡å¨ä¼çå¾ å®¢æ·ç«¯åéæ¶æ¯ã
客æ·ç«¯éªè¯è¯ä¹¦çåæ³æ§ï¼å¦æéªè¯éè¿æä¼è¿è¡åç»éä¿¡ï¼å¦åæ ¹æ®é误æ åµä¸åååºæ示åæä½ï¼åæ³æ§éªè¯å 容å æ¬å¦ä¸:
ç± PKI ä½ç³» çå 容å¯ç¥ï¼å¯¹ç«¯åæ¥çè¯ä¹¦ç¾åæ¯ CA ç§é¥å å¯çï¼æ¥æ¶å°è¯ä¹¦åï¼å 读åè¯ä¹¦ä¸çç¸å ³çææä¿¡æ¯ï¼éç¨ç¸åçæ£åå½æ°è®¡ç®å¾å°ä¿¡æ¯æè¦ï¼ç¶åå©ç¨å¯¹åº CA çå ¬é¥è§£å¯ç¾åæ°æ®ï¼å¯¹æ¯è¯ä¹¦çä¿¡æ¯æè¦ï¼å¦æä¸è´ï¼åå¯ä»¥ç¡®è®¤è¯ä¹¦çåæ³æ§ï¼ç¶åå»æ¥è¯¢è¯ä¹¦çåéæ åµç
åæ³æ§éªè¯éè¿ä¹åï¼å®¢æ·ç«¯è®¡ç®äº§çéæºæ°åçé¢ä¸»å¯é¥ï¼Pre-masterï¼ï¼å¹¶ç¨è¯ä¹¦å ¬é¥å å¯ï¼åéç»æå¡å¨å¹¶æºå¸¦å®¢æ·ç«¯ä¸ºå¯é¥äº¤æ¢æä¾çææä¿¡æ¯ãè¿ä¸ªæ¶æ¯åååçå¯ç å¥ä»¶çå½±åï¼å 容éçä¸åçååå¯ç å¥ä»¶èä¸åã
æ¤æ¶å®¢æ·ç«¯å·²ç»è·åå ¨é¨ç计ç®ååå¯é¥éè¦çä¿¡æ¯: 两个ææéæºæ° random_C å random_S ä¸èªå·±è®¡ç®äº§çç Pre-masterï¼ç¶åå¾å°ååå¯é¥(ç¨äºä¹åçæ¶æ¯å å¯)
å¾ä¸ä½¿ç¨çæ¯ ECDHE ç®æ³ï¼ClientKeyExchange ä¼ éçæ¯ DH ç®æ³ç客æ·ç«¯åæ°ï¼å¦æ使ç¨çæ¯ RSA ç®æ³åæ¤å¤åºè¯¥ä¼ éå å¯çé¢ä¸»å¯é¥
éç¥æå¡å¨åç»çéä¿¡é½éç¨ååçéä¿¡å¯é¥åå å¯ç®æ³è¿è¡å å¯éä¿¡
Finished æ¶æ¯æå³çæ¡æå·²ç»å®æãæ¶æ¯å 容å°å å¯ï¼ä»¥ä¾¿åæ¹å¯ä»¥å®å ¨å°äº¤æ¢éªè¯æ´ä¸ªæ¡æå®æ´æ§æéçæ°æ®ã
è¿ä¸ªæ¶æ¯å å« verify_data å段ï¼å®çå¼æ¯æ¡æè¿ç¨ä¸æææ¶æ¯çæ£åå¼ãè¿äºæ¶æ¯å¨è¿æ¥ä¸¤ç«¯é½æç §åèªæè§ç顺åºæåï¼å¹¶ä»¥ååå¾å°ç主å¯é¥ (enc_key) 计ç®æ£åãè¿ä¸ªè¿ç¨æ¯éè¿ä¸ä¸ªä¼ªéæºå½æ°ï¼pseudorandom functionï¼PRFï¼æ¥å®æçï¼è¿ä¸ªå½æ°å¯ä»¥çæä»»ææ°éç伪éæºæ°æ®ã
两端ç计ç®æ¹æ³ä¸è´ï¼ä½ä¼ä½¿ç¨ä¸åçæ ç¾ï¼finished_labelï¼ï¼å®¢æ·ç«¯ä½¿ç¨ client finishedï¼èæå¡å¨åä½¿ç¨ server finishedã
å 为 Finished æ¶æ¯æ¯å å¯çï¼å¹¶ä¸å®ä»¬çå®æ´æ§ç±åå MAC ç®æ³ä¿è¯ï¼æ以主å¨ç½ç»æ»å»è ä¸è½æ¹åæ¡ææ¶æ¯å¹¶å¯¹ vertify_data çå¼é åãå¨ TLS 1.2 çæ¬ä¸ï¼Finished æ¶æ¯çé¿åº¦é»è®¤æ¯ åèï¼ ä½ï¼ï¼å¹¶ä¸å 许å¯ç å¥ä»¶ä½¿ç¨æ´é¿çé¿åº¦ãå¨æ¤ä¹åççæ¬ï¼é¤äº SSL 3 ä½¿ç¨ åèçå®é¿æ¶æ¯ï¼å ¶ä»çæ¬é½ä½¿ç¨ åèçå®é¿æ¶æ¯ã
æå¡å¨ç¨ç§é¥è§£å¯å å¯ç Pre-master æ°æ®ï¼åºäºä¹å交æ¢ç两个ææéæºæ° random_C å random_Sï¼åæ ·è®¡ç®å¾å°ååå¯é¥: enc_key = PRF(Pre_master, "master secret", random_C + random_S) ;
åæ ·è®¡ç®ä¹åæææ¶åä¿¡æ¯ç hash å¼ï¼ç¶åç¨ååå¯é¥è§£å¯å®¢æ·ç«¯åéç verify_data_Cï¼éªè¯æ¶æ¯æ£ç¡®æ§;
æå¡ç«¯éªè¯éè¿ä¹åï¼æå¡å¨åæ ·åé change_cipher_spec 以åç¥å®¢æ·ç«¯åç»çéä¿¡é½éç¨ååçå¯é¥ä¸ç®æ³è¿è¡å å¯éä¿¡ï¼å¾ä¸å¤äºä¸æ¥ New Session Ticketï¼æ¤ä¸ºä¼è¯ç¥¨è¯ï¼ä¼å¨ä¼è¯æ¢å¤ä¸è§£éï¼;
æå¡å¨ä¹ç»åææå½åçéä¿¡åæ°ä¿¡æ¯çæä¸æ®µæ°æ® (verify_data_S) 并éç¨ååå¯é¥ session secret (enc_key) ä¸ç®æ³å å¯å¹¶åéå°å®¢æ·ç«¯;
客æ·ç«¯è®¡ç®æææ¥æ¶ä¿¡æ¯ç hash å¼ï¼å¹¶éç¨ååå¯é¥è§£å¯ verify_data_Sï¼éªè¯æå¡å¨åéçæ°æ®åå¯é¥ï¼éªè¯éè¿åæ¡æå®æ;
å¼å§ä½¿ç¨ååå¯é¥ä¸ç®æ³è¿è¡å å¯éä¿¡ã
HTTPS éè¿ TLS å±åè¯ä¹¦æºå¶æä¾äºå 容å å¯ã身份认è¯åæ°æ®å®æ´æ§ä¸å¤§åè½ãå å¯è¿ç¨ä¸ï¼éè¦ç¨å°é对称å¯é¥äº¤æ¢å对称å 容å å¯ä¸¤å¤§ç®æ³ã
对称å 容å å¯å¼ºåº¦é常é«ï¼å 解å¯é度ä¹å¾å¿«ï¼åªæ¯æ æ³å®å ¨å°çæåä¿ç®¡å¯é¥ãå¨ TLS åè®®ä¸ï¼æåçåºç¨æ°æ®é½æ¯ç»è¿å¯¹ç§°å å¯åä¼ è¾çï¼ä¼ è¾ä¸æ使ç¨ç对称ååå¯é¥(ä¸æä¸ç enc_key)ï¼åæ¯å¨æ¡æé¶æ®µéè¿é对称å¯é¥äº¤æ¢èæ¥ã常è§ç AES-GCMãChaCha-Polyï¼é½æ¯å¯¹ç§°å å¯ç®æ³ã
é对称å¯é¥äº¤æ¢è½å¨ä¸å®å ¨çæ°æ®ééä¸ï¼äº§çåªæéä¿¡åæ¹æç¥éç对称å å¯å¯é¥ãç®åæ常ç¨çå¯é¥äº¤æ¢ç®æ³æ RSA å ECDHEã
RSA åå²æ ä¹ ï¼æ¯æ度好ï¼ä½ä¸æ¯æ å®ç¾ååå®å ¨ - PFS(Perfect Forward Secrecy) ï¼è ECDHE æ¯ä½¿ç¨äº ECCï¼æ¤åæ²çº¿ï¼ç DHï¼Diffie-Hellmanï¼ç®æ³ï¼è®¡ç®é度快ï¼ä¸æ¯æ PFSã
å¨ PKI ä½ç³» ä¸èä¸è¯´æäºä» æé对称å¯é¥äº¤æ¢è¿æ¯æ æ³æµå¾¡ MITM æ»å»çï¼æ以éè¦å¼å ¥äº PKI ä½ç³»çè¯ä¹¦æ¥è¿è¡èº«ä»½éªè¯ï¼å ¶ä¸æå¡ç«¯é对称å å¯äº§ççå ¬é¥ä¼æ¾å¨è¯ä¹¦ä¸ä¼ ç»å®¢æ·ç«¯ã
å¨ RSA å¯é¥äº¤æ¢ä¸ï¼æµè§å¨ä½¿ç¨è¯ä¹¦æä¾ç RSA å ¬é¥å å¯ç¸å ³ä¿¡æ¯ï¼å¦ææå¡ç«¯è½è§£å¯ï¼æå³çæå¡ç«¯æ¥æä¸å ¬é¥å¯¹åºçç§é¥ï¼åæ¶ä¹è½ç®åºå¯¹ç§°å å¯æéå¯é¥ãå¯é¥äº¤æ¢åæå¡ç«¯è®¤è¯å并å¨ä¸èµ·ã
å¨ ECDH å¯é¥äº¤æ¢ä¸ï¼æå¡ç«¯ä½¿ç¨ç§é¥ (RSA æ ECDSA) 对ç¸å ³ä¿¡æ¯è¿è¡ç¾åï¼å¦ææµè§å¨è½ç¨è¯ä¹¦å ¬é¥éªè¯ç¾åï¼å°±è¯´ææå¡ç«¯ç¡®å®æ¥æ对åºç§é¥ï¼ä»èå®æäºæå¡ç«¯è®¤è¯ãå¯é¥äº¤æ¢åæ¯åèªåé DH åæ°å®æçï¼å¯é¥äº¤æ¢åæå¡ç«¯è®¤è¯æ¯å®å ¨åå¼çã
å¯ç¨äº ECDHE æ°åç¾åçç®æ³ä¸»è¦æ RSA å ECDSA - æ¤åæ²çº¿æ°åç¾åç®æ³ ï¼ä¹å°±æ¯ç®åå¯é¥äº¤æ¢ + ç¾åæä¸ç§ä¸»æµéæ©:
æ¯å¦æçç½ç«ä½¿ç¨çå å¯å¥ä»¶æ¯ ECDHE_RSAï¼å¯ä»¥çå°æ°åç¾åç®æ³æ¯ sha åå¸å RSA å å¯ï¼å¨ PKI ä½ç³» ä¸èä¸è®²äºç¾åæ¯æå¡å¨ä¿¡æ¯æè¦çåå¸å¼å å¯çæç
å ç½® ECDSA å ¬é¥çè¯ä¹¦ä¸è¬è¢«ç§°ä¹ä¸º ECC è¯ä¹¦ï¼å ç½® RSA å ¬é¥çè¯ä¹¦å°±æ¯ RSA è¯ä¹¦ãå 为 ä½ ECC Key å¨å®å ¨æ§ä¸çåäº ä½ RSA Keyï¼æ以 ECC è¯ä¹¦ä½ç§¯æ¯ RSA è¯ä¹¦å°ï¼èä¸ ECC è¿ç®é度æ´å¿«ï¼ECDHE å¯é¥äº¤æ¢ + ECDSA æ°åç¾åæ¯ç®åæ好çå å¯å¥ä»¶
以ä¸å 容æ¥èªæ¬æ: å¼å§ä½¿ç¨ ECC è¯ä¹¦
å ³äº ECC è¯ä¹¦çæ´å¤ç»èå¯è§ææ¡£: ECC Cipher Suites for TLS - RFC
ä½¿ç¨ RSA è¿è¡å¯é¥äº¤æ¢çæ¡æè¿ç¨ä¸åé¢è¯´æçåºæ¬ä¸è´ï¼åªæ¯æ²¡æ ServerKeyExchange æ¶æ¯ï¼å ¶ä¸ååå¯é¥æ¶åå°ä¸ä¸ªåæ° (客æ·ç«¯éæºæ° random_Cãæå¡ç«¯éæºæ° random_Sãé¢ä¸»å¯é¥ Premaster secret)ï¼
å ¶ä¸å两个éæºæ°ååå使ç¨çç®æ³æ¯ææçå¾å®¹æè·åï¼æåä¸ä¸ª Premaster secret ä¼ç¨æå¡å¨æä¾çå ¬é¥å å¯åä¼ è¾ç»æå¡å¨ (å¯é¥äº¤æ¢)ï¼å¦æè¿ä¸ªé¢ä¸»å¯é¥è¢«æªåå¹¶ç ´è§£åååå¯é¥ä¹å¯ä»¥è¢«ç ´è§£ã
RSA ç®æ³çç»èè§: wiki å RSAç®æ³åçï¼äºï¼- é®ä¸å³°
RSA çç®æ³æ ¸å¿ææ³æ¯å©ç¨äºæ大æ´æ° å æ°å解 ç计ç®å¤ææ§
èä½¿ç¨ DH(Diffie-Hellman) ç®æ³ è¿è¡å¯é¥äº¤æ¢ï¼åæ¹åªè¦äº¤æ¢åèªç DH åæ°(å¨ ServerKeyExchange åé Server paramsï¼å¨ ClientKeyExchange åé Client params)ï¼ä¸éè¦ä¼ é Premaster secretï¼å°±å¯ä»¥åèªç®åºè¿ä¸ªé¢ä¸»å¯é¥
DH çæ¡æè¿ç¨å¦ä¸ï¼å¤§è´è¿ç¨ä¸ RSA 类似ï¼å¾ä¸åªè¡¨è¾¾å¦ä½çæé¢ä¸»å¯é¥:
æå¡å¨éè¿ç§é¥å°å®¢æ·ç«¯éæºæ° random_Cï¼æå¡ç«¯éæºæ° random_Sï¼æå¡ç«¯ DH åæ° Server params ç¾åçæ signatureï¼ç¶åå¨ ServerKeyExchange æ¶æ¯ä¸åéæå¡ç«¯ DH åæ°å该ç¾åï¼
客æ·ç«¯æ¶å°åç¨æå¡å¨ç»çå ¬é¥è§£å¯éªè¯ç¾åï¼å¹¶å¨ ClientKeyExchange æ¶æ¯ä¸åé客æ·ç«¯ DH åæ° Client paramsï¼
æå¡ç«¯æ¶å°åï¼åæ¹é½æè¿ä¸¤ä¸ªåæ°ï¼ååèªä½¿ç¨è¿ä¸¤ä¸ªåæ°çæé¢ä¸»å¯é¥ Premaster secretï¼ä¹åçååå¯é¥çæ¥éª¤ä¸ RSA åºæ¬ä¸è´ã
å ³äº DH ç®æ³å¦ä½çæé¢ä¸»å¯é¥ï¼æ¨èçä¸ Wiki å Ephemeral Diffie-Hellman handshake
å ¶æ ¸å¿ææ³æ¯å©ç¨äº 离æ£å¯¹æ°é®é¢ ç计ç®å¤ææ§
ç®æ³è¿ç¨å¯ä»¥æ½è±¡æä¸å¾:
åæ¹é¢å åå®å¥½äºä¸å¯¹ P g å¼ (å ¬å¼ç)ï¼è Alice æä¸ä¸ªç§å¯æ° a(éå ¬å¼ï¼å¯¹åºä¸ä¸ªç§é¥)ï¼Bob æä¸ä¸ªç§å¯æ° b(éå ¬å¼ï¼å¯¹åºä¸ä¸ªç§é¥)
å¯¹äº Alice å Bob æ¥è¯´éè¿å¯¹æ¹åè¿æ¥çå ¬é¥åæ°åèªå·±æä¸çç§é¥å¯ä»¥å¾å°æç»ç¸åçå¯é¥
è第ä¸æ¹æå¤ç¥é P g A Bï¼æ³å¾å°ç§é¥åæåçå¯é¥å¾å°é¾ï¼å½ç¶åææ¯ a b P 足å¤å¤§ (RFC ææ¡£ä¸æå 个常ç¨çå¤§ç´ æ°å¯ä¾ä½¿ç¨)ï¼å¦åæ´åç ´è§£ä¹æå¯è½è¯åºçæ¡ï¼è³äº g ä¸è¬å个è¾å°å¼å°±å¯ä»¥
å¦ä¸å å¼ å¾æ¯å®é DH æ¡æåéçå 容:
å¯ä»¥çå°åæ¹åç»å¯¹æ¹çåæ°ä¸æºå¸¦äºä¸ä¸ªå ¬é¥å¼ï¼å¯¹åºä¸è¿°ç A å B
èä¸å®é ç¨çå å¯å¥ä»¶æ¯ æ¤åæ²çº¿ DH å¯é¥äº¤æ¢ (ECDH) ï¼å©ç¨ç±æ¤åæ²çº¿å å¯å»ºç«å ¬é¥ä¸ç§é¥å¯¹å¯ä»¥æ´è¿ä¸æ¥å 强 DH çå®å ¨æ§ï¼å 为ç®å解å³æ¤åæ²çº¿ç¦»æ£å¯¹æ°é®é¢è¦æ¯å å¼å解å°é¾çå¤ï¼èä¸ ECC 使ç¨çå¯é¥é¿åº¦æ¯ RSA å¯é¥çå¾å¤(ç®å RSA å¯é¥éè¦ ä½ä»¥ä¸æè½ä¿è¯å®å ¨ï¼è ECC å¯é¥ ä½å°±è¶³å¤)
å ³äº æ¤åæ²çº¿å¯ç å¦ - ECC ï¼æ¨èçä¸ A Primer on Elliptic Curve Cryptography - åæ - è¯æ
尽管å¯ä»¥éæ©å¯¹ä»»æä¸ç«¯è¿è¡èº«ä»½éªè¯ï¼ä½äººä»¬å ä¹é½å¯ç¨äºå¯¹æå¡å¨ç身份éªè¯ãå¦ææå¡å¨éæ©çå¥ä»¶ä¸æ¯å¿åçï¼é£ä¹å°±éè¦å¨ Certificate æ¶æ¯ä¸è·ä¸èªå·±çè¯ä¹¦ã
ç¸æ¯ä¹ä¸ï¼æå¡å¨éè¿åé CertificateRequest æ¶æ¯è¯·æ±å¯¹å®¢æ·ç«¯è¿è¡èº«ä»½éªè¯ãæ¶æ¯ä¸ååºææå¯æ¥åç客æ·ç«¯è¯ä¹¦ãä½ä¸ºååºï¼å®¢æ·ç«¯åéèªå·±ç Certificate æ¶æ¯ï¼ä½¿ç¨ä¸æå¡å¨åéè¯ä¹¦ç¸åçæ ¼å¼ï¼ï¼å¹¶éä¸è¯ä¹¦ãæ¤åï¼å®¢æ·ç«¯åé CertificateVerify æ¶æ¯ï¼è¯æèªå·±æ¥æ对åºçç§é¥ã
åªæå·²ç»è¿èº«ä»½éªè¯çæå¡å¨æ被å 许请æ±å®¢æ·ç«¯èº«ä»½éªè¯ãåºäºè¿ä¸ªåå ï¼è¿ä¸ªé项ä¹è¢«ç§°ä¸ºç¸äºèº«ä»½éªè¯ï¼mutual authenticationï¼ã
å¨ ServerHello çè¿ç¨ä¸ååºï¼è¯·æ±å¯¹å®¢æ·ç«¯è¿è¡èº«ä»½éªè¯ï¼å¹¶å°å ¶æ¥åçè¯ä¹¦çå ¬é¥åç¾åç®æ³ä¼ éç»å®¢æ·ç«¯ã
å®ä¹å¯ä»¥éæ©åéä¸ä»½èªå·±æ¥åçè¯ä¹¦é¢åæºæå表ï¼è¿äºæºæé½ç¨å ¶å¯å辨å称æ¥è¡¨ç¤º:
å¨ ClientKeyExchange çè¿ç¨ä¸ååºï¼è¯æèªå·±æ¥æçç§é¥ä¸ä¹ååéç客æ·ç«¯è¯ä¹¦ä¸çå ¬é¥å¹é ãæ¶æ¯ä¸å å«ä¸æ¡å°è¿ä¸æ¥ä¸ºæ¢çæææ¡ææ¶æ¯çç¾åï¼
æåçä¼è¯æ¢å¤æºå¶æ¯ï¼å¨ä¸æ¬¡å®æ´ååçè¿æ¥æå¼æ¶ï¼å®¢æ·ç«¯åæå¡å¨é½ä¼å°ä¼è¯çå®å ¨åæ°ä¿åä¸æ®µæ¶é´ãå¸æ使ç¨ä¼è¯æ¢å¤çæå¡å¨ä¸ºä¼è¯æå®å¯ä¸çæ è¯ï¼ç§°ä¸ºä¼è¯ ID(Session ID)ãæå¡å¨å¨ ServerHello æ¶æ¯ä¸å°ä¼è¯ ID åå客æ·ç«¯ã
å¸ææ¢å¤æ©å ä¼è¯ç客æ·ç«¯å°éå½ç Session ID æ¾å ¥ ClientHello æ¶æ¯ï¼ç¶åæ交ãæå¡å¨å¦æåææ¢å¤ä¼è¯ï¼å°±å°ç¸åç Session ID æ¾å ¥ ServerHello æ¶æ¯è¿åï¼æ¥ç使ç¨ä¹åååç主å¯é¥çæä¸å¥æ°çå¯é¥ï¼ååæ¢å°å å¯æ¨¡å¼ï¼åé Finished æ¶æ¯ã
客æ·ç«¯æ¶å°ä¼è¯å·²æ¢å¤çæ¶æ¯ä»¥åï¼ä¹è¿è¡ç¸åçæä½ãè¿æ ·çç»ææ¯æ¡æåªéè¦ä¸æ¬¡ç½ç»å¾è¿ã
Session ID ç±æå¡å¨ç«¯æ¯æï¼åè®®ä¸çæ åå段ï¼å æ¤åºæ¬æææå¡å¨é½æ¯æï¼æå¡å¨ç«¯ä¿åä¼è¯ ID 以åååçéä¿¡ä¿¡æ¯ï¼å ç¨æå¡å¨èµæºè¾å¤ã
ç¨æ¥æ¿ä»£æå¡å¨ä¼è¯ç¼ååæ¢å¤çæ¹æ¡æ¯ä½¿ç¨ä¼è¯ç¥¨è¯ï¼Session ticketï¼ã使ç¨è¿ç§æ¹å¼ï¼é¤äºææçç¶æé½ä¿åå¨å®¢æ·ç«¯ï¼ä¸ HTTP Cookie çåç类似ï¼ä¹å¤ï¼å ¶æ¶æ¯æµä¸æå¡å¨ä¼è¯ç¼åæ¯ä¸æ ·çã
å ¶ææ³æ¯æå¡å¨ååºå®çææä¼è¯æ°æ®ï¼ç¶æï¼å¹¶è¿è¡å å¯ (å¯é¥åªææå¡å¨ç¥é)ï¼å以票è¯çæ¹å¼åå客æ·ç«¯ãå¨æ¥ä¸æ¥çè¿æ¥ä¸ï¼å®¢æ·ç«¯æ¢å¤ä¼è¯æ¶å¨ ClientHello çæ©å±å段session_ticket ä¸æºå¸¦å å¯ä¿¡æ¯å°ç¥¨è¯æ交åæå¡å¨ï¼ç±æå¡å¨æ£æ¥ç¥¨è¯çå®æ´æ§ï¼è§£å¯å ¶å 容ï¼å使ç¨å ¶ä¸çä¿¡æ¯æ¢å¤ä¼è¯ã
è¿ç§æ¹æ³æå¯è½ä½¿æ©å±æå¡å¨é群æ´ä¸ºç®åï¼å 为å¦æä¸ä½¿ç¨è¿ç§æ¹å¼ï¼å°±éè¦å¨æå¡é群çå个èç¹ä¹é´åæ¥ä¼è¯ã
Session ticket éè¦æå¡å¨å客æ·ç«¯é½æ¯æï¼å±äºä¸ä¸ªæ©å±å段ï¼å ç¨æå¡å¨èµæºå¾å°ã
Diffie-Hellman密钥交换算法
从数学难题谈起,离散对数问题成为密码学的密源码e密源码实基础。具体而言,解加解若设i为以a为底模p的密源码e密源码实离散对数,当中的解加解参数足够大时,求解i成为一项几乎无法实现的密源码e密源码实签名 java源码挑战,这为密码学提供了安全保证。解加解
在Diffie-Hellman密钥交换算法中,密源码e密源码实Alice和Bob通过事先约定的解加解
和g,在不直接共享密钥的密源码e密源码实情况下,能够协商出一个会话密钥K。解加解该过程基于以下公式:
,密源码e密源码实由此K即为协商结果。解加解证明该过程涉及对上述公式的密源码e密源码实深入理解。
算法的解加解核心在于,即便第三方知晓了a和b,计算会话密钥K仍然是极其困难的任务,这正是Diffie-Hellman算法的安全性所在。
然而,静态DH算法因存在安全性缺陷而逐渐被淘汰,即一方的私钥保持不变。这一做法可能导致前向安全性丧失,使得破解后的密钥可用于回溯分析之前的通信数据。
为解决这一问题,动态DH(DHE)引入了临时生成私钥的机制,通过每次通信时更新私钥,显著提高了安全性,但同时也带来了性能上的挑战。为克服这一限制,ECDHE(Elliptic Curve Diffie-Hellman)应运而生,它利用椭圆曲线的特性,以更高效的方式实现密钥交换。
ECDHE算法基于椭圆曲线离散对数难题,即已知P和G,求解满足P=dG的蘑菇街 源码d是一个难以解决的问题。这意味着,即使在通信链路中公开了G、A、B,由于解密困难,密钥协商过程保持了高度安全性。
不同组织定义了各种椭圆曲线,它们通过不同的命名方式来识别特定的曲线参数。例如,SECG定义了以Koblitz和随机数为特征的secp系列曲线,NIST定义了标准化曲线,ANSI提供了另外一套标准。X系列曲线的命名则与曲线参数的位数相关,如x和x分别对应于特定位数的p值。
综上所述,Diffie-Hellman密钥交换算法及其衍生版本,如DHE和ECDHE,通过巧妙地利用数学难题,确保了通信的安全性。同时,不同组织的椭圆曲线命名体系为密码学的标准化与多样性提供了基础。
ç¨WireSharkç®åççSSL/TLSåè®®
HTTPSç®åæ¯ç½ç«æ é ï¼å¦åæµè§å¨ä¼æ示é¾æ¥ä¸å®å ¨ï¼åHTTPç¸æ¯æ¯ï¼HTTPSæä¾å®å ¨éä¿¡ï¼å ·ä½åå æ¯å¤äºä¸ªâSâå±ï¼æè 说SSLå±[Secure Sockets Layer]ï¼ç°å¨ä¸è¬é½æ¯TLS[Transport Layer Security]ï¼å®æ¯HTTPææéä¿¡åæå®å ¨å å¯éä¿¡çåºç¡ï¼SSL/TLSä»äºåºç¨å±åTCPå±ä¹é´ï¼ä»åºç¨å±æ°æ®è¿è¡å å¯åä¼ è¾ãå®å ¨çæ ¸å¿å°±å¨å å¯ä¸ï¼å¦ä¸å¾æ示ï¼HTTPææéä¿¡ç»ä¸é´è·¯ç±æç»åéç»å¯¹æ¹ï¼å¦æä¸é´æ个路ç±èç¹æåäºæ°æ®ï¼å°±å¯ä»¥ç´æ¥çå°éä¿¡å 容ï¼çè³å¯ä»¥ç¯¡æ¹åï¼è·¯ç±ç»ç®æ 对象ï¼å¦ä¸ï¼
å¯è§HTTPä¼ è¾æ¯ä¸å®å ¨çï¼ä½ï¼å¦æä¼ è¾çæ¯åªæåæ¹å¯æ ¡éªçå¯æï¼å°±å¯ä»¥é¿å 被å·çªã篡æ¹ï¼ä¿è¯ä¼ è¾çå®å ¨æ§ï¼è¿å°±æ¯SSL/TLSå±åçäºæ ã
SSL/TLSå议主è¦ä»ä¸æ¹é¢æ¥ä¿è¯æ°æ®ä¼ è¾çå®å ¨æ§ï¼ä¿å¯ãé´å«ãå®æ´ï¼
对ç¨æ·ç«¯èè¨ï¼æä¹ä¿è¯è®¿é®çç½ç«å°±æ¯ç®æ ç½ç«ï¼çæ¡å°±æ¯è¯ä¹¦ãæ¯ä¸ªHTTPSç½ç«é½éè¦TLSè¯ä¹¦ï¼å¨æ°æ®ä¼ è¾å¼å§åï¼æå¡ç«¯å å°è¯ä¹¦ä¸åå°ç¨æ·ç«¯ï¼ç±ç¨æ·æ ¹æ®è¯ä¹¦å¤ææ¯å¦æ¯ç®æ ç½ç«ãè¿å ¶ä¸çåçæ¯ä»ä¹ï¼è¯ä¹¦åæ¯å¦ä½æ è¯ç½ç«çæææ§å¢ï¼è¯ä¹¦ä¹å« digital certificate æè public key certificateï¼æ¯å¯ç å¦ä¸çæ¦å¿µï¼å¨TLSä¸å°±æ¯æCAè¯ä¹¦ãç±è¯ä¹¦çç¾åæºæï¼Certificate Authorityï¼ç®ç§°ä¸º CAï¼é¢å¸çè¯ä¹¦ãï¼å¥½æ¯æ¯æå¨é¨é¨çå ¬ç« ï¼WIKIç¾ç§è§£éå¦ä¸ï¼
大æå°±æ¯è¯ä¹¦å å«äºç®æ ç«ç¹ç身份信æ¯ï¼å¹¶å¯ä»¥éè¿æç§æ¹å¼æ ¡éªå ¶åæ³æ§ï¼å¯¹äºä»»ä½ä¸ä¸ªHTTPSç½ç«ï¼ä½ é½å¯ä»¥æ¿å°å ¶CAè¯ä¹¦å ¬é¥ä¿¡æ¯ï¼å¨Chromeæµè§å¨ä¸ç¹å»HTTPSç½ç«çéæ å¿ï¼å°±å¯ä»¥æ¥çå ¬é¥ä¿¡æ¯ï¼å¹¶å¯ä»¥å¯¼åºCAäºè¿å¶æ件ï¼
æµè§å¨å°±æ¯éè¿è¿ä¸ªæ件æ¥æ ¡éªç½ç«æ¯å¦å®å ¨åæ³ï¼å¯ä»¥çå°ï¼è¯ä¹¦å ¶å®å ç½®äºä¸ä¸ªé¢åé¾æ¡å ³ç³»ï¼æ ¹è¯ä¹¦æºæ->次级è¯ä¹¦æºæ->次次级->ç½ç«èªèº«ï¼åªè¦éªè¯è¿ä¸ªé¾æ¡æ¯å®å ¨çï¼å°±è¯æç½ç«åæ³ï¼èåçææ¯å ¶å®æ¯ä¿¡ä»»é¾+RSAçé对称å å¯+ç³»ç»å ç½®æ ¹è¯ä¹¦ãCAå¨é¢åè¯ä¹¦çæ¶åï¼ä¼ç¨èªå·±çç§é¥è®¡ç®åºè¦é¢åè¯ä¹¦çç¾åï¼å ¶å ¬é¥æ¯å ¬å¼çï¼åªè¦ç¾åå¯è¢«å ¬é¥éªè¯å°±è¯´æ该è¯ä¹¦æ¯ç±è¯¥CAé¢åçï¼æ ¸å¿æ ¡éªé»è¾å¦ä¸
é£ä¹ä¸çº§çCAåæ¯å¦ä½ä¿è¯å®å ¨å¢ï¼éå¤ä¸è¿°æä½å³å¯ï¼æç»é½æ¯é æ ¹è¯ä¹¦æ¥éªè¯çï¼æ ¹è¯ä¹¦çå®å ¨æ§ä¸éè¦éªè¯ï¼ç±ç³»ç»ä¿è¯ï¼å¦æ¤å°±å½¢æäºä¸ä¸ªè¯ä¹¦çä¿¡ä»»é¾ï¼ä¹å°±è½éªè¯å½åç½ç«è¯ä¹¦çæææ§ï¼è¯ä¹¦çä¿¡ä»»é¾æ ¡éªå¦ä¸ï¼
TLSåè®®æ大çæåç¹å°±æ¯æ°æ®çå®å ¨ï¼éHTTPéä¿¡ç¸æ¯ï¼HTTPSçéä¿¡æ¯å å¯çï¼å¨ååé¶æ®µï¼éè¿é对称å å¯ç¡®å®å¯¹ç§°å å¯ä½¿ç¨çç§é¥ï¼ä¹åå©ç¨å¯¹ç§°ç§é¥è¿è¡å å¯éä¿¡ï¼è¿æ ·ä¼ è¾çæ°æ®å°±æ¯å¯æï¼å°±ç®ä¸é´èç¹æ³æ¼ï¼ä¹å¯ä»¥ä¿è¯æ°æ®ä¸è¢«çªåï¼ä»èä¿è¯éä¿¡æ°æ®çå®å ¨æ§ã
第ä¸ä¸ªé®é¢ï¼è½ç¶ä¸é´èç¹æ æ³çªåæ°æ®ï¼ä½æ¯è¿æ¯å¯ä»¥éææ´æ¹æ°æ®çï¼é£ä¹æä¹ä¿è¯æ°æ®çå®æ´æ§å¢ï¼è¿ä¸ªå ¶å®ä»»ä½æ°æ®ä¼ è¾ä¸é½ä¼æè¿ä¸ªé®é¢ï¼éè¿MAC[Message Authentication Codes]ä¿¡æ¯æè¦ç®æ³å°±å¯ä»¥è§£å³è¿ä¸ªé®é¢ï¼åæ®éMD5ãSHAç对æ¯ï¼MACæ¶æ¯çæ£åå å ¥äºç§é¥çæ¦å¿µï¼æ´å å®å ¨ï¼æ¯MD5åSHAç®æ³çå级çï¼å¯ä»¥è®¤ä¸ºTLSå®æ´æ§æ¯æ°æ®ä¿å¯æ§å»¶ä¼¸ï¼æ¥ä¸æ¥å°±åå©WireSharkççTLSæ¡æçè¿ç¨ï¼å¹¶ççæ¯å¦ä½å®ç°èº«ä»½é´å«ãä¿å¯æ§ãå®æ´æ§çã
HTTPSå®å ¨éä¿¡ç®åæ¥è¯´ï¼å¨ååé¶æ®µç¨é对称å å¯åå好éä¿¡ç对称ç§é¥ï¼ç¶åç¨å¯¹ç§°ç§é¥å å¯è¿è¡æ°æ®éä¿¡ï¼ç®æçWireShark TLS/SSLååè¿ç¨ç¤ºæå¦ä¸ï¼
ç»åå离å示æå¦ä¸ï¼
æ¡æåå¤ä¸ªé¶æ®µï¼ä¸è¿ä¸æ¬¡æ¡æå¯ä»¥å®æå¤ä¸ªå¨ä½ï¼èä¸ä¹å¹¶ä¸æ¯ææç±»åçæ¡æé½æ¯ä¸è¿°æ¨¡åï¼å 为åå对称ç§é¥çç®æ³ä¸æ¢ä¸ç§ï¼æ以æ¡æçå ·ä½æä½ä¹å¹¶éä¸æä¸åï¼æ¯å¦RSAå°±æ¯ECDHEè¦ç®åçå¤ï¼ç®å主æµä½¿ç¨çé½æ¯ECDHEï¼å ·ä½æµç¨æåå¦ä¸ï¼
Client Helloæ¯TLS/SSLæ¡æåèµ·ç第ä¸ä¸ªå¨ä½ï¼ç±»ä¼¼TCPçSYNï¼Client Hello é¶æ®µå®¢æ·ç«¯ä¼æå®çæ¬ï¼éæºæ°ãæ¯æçå¯ç å¥ä»¶ä¾æå¡ç«¯éæ©ï¼å ·ä½çå æ°æ®å¦ä¸
å¯å¨TLSæ¡æè¿ç¨ï¼æä¾èªå·±æè½æ¯æåç§ç®æ³ï¼åæ¶æä¾ä¸ä¸ªå°æ¥æè½ç¨å°çéæºæ°ã
ContentTypeæ示TLSéä¿¡å¤äºåªä¸ªé¶æ®µé¶æ®µï¼å¼ä»£è¡¨Handshakeï¼æ¡æé¶æ®µï¼Versionæ¯TLSççæ¬1.2ï¼å¨æ¡æé¶æ®µï¼åé¢é¾æ¥çå°±æ¯æ¡æåè®®ï¼è¿éæ¯Client Helloï¼å¼æ¯1ï¼åæ¶è¿ä¼å建ä¸ä¸ªéæºæ°randomç»Serverï¼å®ä¼å¨çæsession keyã对称å¯é¥ãæ¶ä½¿ç¨ãä¹åå°±æ¯æ¯æçä¾æå¡ç«¯éæ©çå¯ç å¥ä»¶ï¼æ¥ä¸æ¥çæå¡ç«¯è¿åã
Handshake Type: Server Hello (2)ï¼ä½ä¸ºå¯¹Client Helloçååº ï¼ç¡®å®ä½¿ç¨çå å¯å¥ä»¶: TLS_ECDHE_RSA_WITH_AES__GCM_SHA (0xcf)ï¼å¯é¥ååä½¿ç¨ ECDHEï¼ç¾åä½¿ç¨ RSAï¼
æ°æ®éä¿¡éä¿¡ä½¿ç¨ AES 对称å å¯ï¼å¹¶ä¸å¯é¥é¿åº¦æ¯ä½ï¼GCMåç»ï¼åæ¶çæä¸ä¸ªæå¡ç«¯çrandomåä¼è¯IDåä¼ ã
è¿ä¸æ¥æå¡å¨å°é ç½®çè¯ä¹¦ãé¾ãåéç»å®¢æ·ç«¯ï¼å®¢æ·ç«¯åºäºä¸ææè¿°çè¯ä¹¦é¾æ ¡éªè¯ä¹¦çæææ§ï¼è¿éåéçè¯ä¹¦æ¯äºè¿å¶æ ¼ï¼å¯ä»¥å©ç¨wiresharkå³é®âExport Packet Bytesâåè½ï¼å¯¼åº.CERæ ¼å¼çè¯ä¹¦ãå¦ä¸å¯ä»¥çå°ä¼ è¾çè¯ä¹¦é¾ã
导åºçCERæ ¼å¼çè¯ä¹¦å¦ä¸ï¼æå ³é®çå°±å ¶å ¬é¥è·æ°åç¾åã
Server Key Exchangeæ¯é对éå®çECDHEååæå¿ é¡»çæ¥éª¤ï¼Diffie-Hellman模å解éå¦ä¸ï¼
大æå°±æ¯ephemeral Diffie-Hellmanä¸ä¼ä½¿ç¨è¯ä¹¦ä¸çéæå ¬é¥åä¸å¯¹ç§°ç§é¥ççæï¼èæ¯éè¦æå¡ç«¯ä¸å®¢æ·ç«¯éè¿å½¼æ¤ååç¡®å®å¯¹ç§°ç§é¥ï¼èD-Hç®æ³æ¨¡åéè¦ä¸¤å¯¹é对称ç§é¥å¯¹ï¼å端ä¿çèªå·±çç§é¥ï¼åæ¶æ¡æåæ¹çå ¬é¥ï¼ç¶ååºäºD-Hç®æ³å端å¯ä»¥ç®åºä¸æ ·ç对称å å¯ç§é¥ï¼èè¿å°±éè¦C/Säºä¼ èªå·±çå ¬é¥
æå¡ç«¯åå®è¿ä¸æ¥ï¼å ¶å®ECDHEç®æ³ä¸æå¡ç«¯éè¦æä¾çä¿¡æ¯å·²ç»ç»æï¼åé Server Hello Doneåè¯å®¢æ·ç«¯ï¼ç¶åçå¾ å®¢æ·ç«¯åä¼ å®çD-Hå ¬é¥ã
ç®æ³ï¼
å ¶ä¸pågæ¯å ¬å¼çDHåæ°ï¼åªè¦Pæ¯ä¸ä¸ªè¶³å¤å¤§çæ°ï¼å¨ä¸ç¥éç§é¥çæ åµä¸ï¼å³ä½¿æªè·äºåæ¹çå ¬é¥ï¼ä¹æ¯å¾é¾ç ´è§£çã
客æ·ç«¯æ¶å°æå¡ç«¯çè¯ä¹¦åï¼å©ç¨ä¿¡ä»»é¾æ£æµè¯ä¹¦æææ§ï¼åæ¶ä¹ä¼åServer Key Exchange 类似ï¼å°èªå·±çDiffie-Hellmanå ¬é¥åéç»Server端ï¼
è³æ¤ï¼ECDHEååæéè¦çä¿¡æ¯é½ä¼ è¾å®æ¯ï¼ åæ¹é½å¯ä»¥åºäºECDHEç®æ³ç®åºçå ±äº«å¯é¥ï¼åæ¶ç»åä¹åçéæºæ°çææç»ç对称å å¯ç§é¥ï¼
ä¹å客æ·ç«¯åéChange Cipher Specä¸ Encrypted Handshake Messageæ è¯æ¡æå®æï¼åæ¶ä¼ è¾ä¸ä¸ªå å¯çæ°æ®ç»Serverï¼éªè¯åæ¹ç¡®ç«çç§é¥æ¯å¦æ£ç¡®ï¼è¿å°±éè¦æå¡ç«¯ä¹è¦éå¤è¿ä¸ªæä½ç»å®¢æ·ç«¯ï¼è¿æ ·æè½éªè¯å½¼æ¤çå 解å¯ä¸è´ï¼å³æå¡ç«¯ä¹è¦æ¥ä¸æ¬¡Encrypted Handshake Messageåä¼ ç»å®¢æ·ç«¯æ ¡éªï¼
èµ°å®å¦ä¸æµç¨ï¼åæ¹å°±ç¡®è®¤äºæ£ç¡®ç对称å å¯ééï¼åé¢å°±æ¯TLSçæ°æ®éä¿¡ï¼å ¶Record LayerçContentType ä¹ä¼åæ Content Type: Application Data ()ï¼
æç»å¯¹ç§°ä¼è¯å¯é¥å å«ä¸é¨åå åï¼
Client Helloä¸Server Helloé¶æ®µäº¤æ¢çéæºæ°ï¼æ¯ä¸ºäºæé«ç§é¥çãéæºãç¨åº¦èè¿è¡çï¼è¿æ ·æå©äºæé«ä¼è¯å¯é¥ç ´è§£é¾åº¦ã
HTTPSéè¿å å¯ä¸å®æ´æ§æ ¡éªå¯ä»¥é²æ¢æ°æ®å ç ´è§£ä¸ç¯¡æ¹ï¼ä½å¯¹äºä¸»å¨æä¿¡çæå æä½æ¯æ²¡æ³é²æ¤ï¼æ¯å¦Charlesæå ï¼å¨è¿ä¸ªåºæ¯ç¨æ·å·²ç»é£é©ï¼å¹¶ä¸å°Charlesæä¾çè¯ä¹¦ä¿¡ä»»ä¸ºæ ¹è¯ä¹¦ï¼è¿ä»æºå¤´ä¸æ建äºä¸æ¡èæçä¿¡ä»»é¾ï¼å¨æ¡æé¶æ®µï¼Charleså©ç¨èªå·±çå ¬é¥ï¼çæ客æ·ç«¯å¯ä»¥ä¿¡ä»»ç篡æ¹è¯ä¹¦ï¼ä»èå¯ä»¥å ä½ä¸é´äººè¿èæå ï¼æè°ä¸é´äººæ»å»ï¼æè§è·Httpsæå åçä¸æ ·ï¼é½æ¯è¦å¼ºå¶æ·»å ä¸ä¸ªèªå·±çä¿¡ä»»æ ¹è¯ä¹¦ã
NodeJS加解密之Crypto
在互联网的快速扩张中,数据安全成为了不可忽视的关键。开发者应具备安全意识,通过技术手段强化服务的安全性。NodeJS 的 crypto 模块正是为此目的而设计,它提供了通用的加密和哈希算法,利用C/C++实现高性能的算法接口,使得加密、解密和哈希操作变得更加便捷与快速。本文将深入探讨 NodeJS 中加密解密技术,重点关注编码方式、Hash 功能、密码加盐、linux源码 gitHMAC 功能、加密/解密及 DH、ECDH、ECDHE 等密钥交换算法,并提供相关术语的解释,以期为开发者提供全面的指导。
编码方式是信息安全传输的基础。Base 和 Hex 编码各有特点,Base 编码在保证信息可读性的同时,提供了一定的压缩效果,其编码方式为将每3个字节编码为4个字符,相比Hex编码的2倍占用空间,Base编码在空间占用上更为节省。Hex编码虽然难以阅读,但在某些场景下,如逆向工程分析中,能帮助开发者识别原始数据结构。
Hash(摘要)功能则用于确保消息的完整性和一致性,如MD5、SHA等。MD5是广泛使用的散列函数,常用于密码保护、下载文件校验等场景。通过哈希算法计算信息摘要,即使信息稍有改动,摘要也会随之变化,从而能够验证消息的完整性。在密码保护中,原始密码经过哈希运算后存储,以增加破解难度。
密码加盐是一种有效的安全增强措施,通过在密码特定位置插入随机字符串后,再进行哈希运算,使得相同密码在不同用户间生成不同的java 论坛源码哈希值,大大提高了密码的抗暴力破解能力。随机盐值的引入,使得密码的哈希值在每次使用时都不同,进一步提升了安全性。
HMAC(密钥相关的哈希运算消息认证码)在加密安全协议中扮演着重要角色,通过将哈希函数与对称加密算法结合,实现更安全的密钥交换和消息认证。HMAC在加密通信时提供了额外的安全层,确保了数据在传输过程中的完整性和机密性。
加密与解密是信息安全的核心功能。NodeJS 提供了 `crypto.createCipher` 和 `crypto.createDecipher` 方法进行对称加密,而 `crypto.createCipheriv` 和 `crypto.createDecipheriv` 则支持使用自定义密钥和初始向量(IV),为数据提供了更高级别的保护。这些方法允许开发者根据需求选择合适的加密算法,并通过提供的密钥和IV进行数据的安全传输。
数字签名和校验是验证信息来源和完整性的关键步骤。通过使用私钥生成签名,接收方可以使用对应的公钥验证签名的正确性,确保信息未被篡改或伪造。这在电子合同、身份验证和数字证书等场景中发挥着重要作用。
密钥交换算法如 DH(Diffie-Hellman)、ECDH(Elliptic Curve Diffie-Hellman)和 ECDHE(Ephemeral Elliptic Curve Diffie-Hellman)提供了安全的密钥协商机制,让通信双方在不安全的通信信道中安全地交换密钥,用于后续通信的对称加密。ECDHE 特别设计为临时生成私钥,增强了安全性,避免了长期密钥可能带来的风险。
本文旨在为开发者提供加密解密技术的全面理解,包括编码方式、Hash 功能、密码加盐、HMAC 功能、加密/解密及密钥交换算法等核心概念。c 源码大全通过深入学习这些技术,开发者能够构建更加安全、可靠的网络应用。
深入浅出 SSL/TLS 协议
深入解析SSL/TLS协议的加密之旅
在我们每日的网络通信中,TLS协议如同无形的守护者,其背后隐藏着复杂的加密机制。本文将带你一步步探索TLS 1.2和1.3握手流程,以及HTTPS包的神秘面纱。让我们一起揭开这加密世界的一角。客户端发起连接:ClientHello的构造
在建立TLS连接时,客户端的ClientHello包包含关键信息,如:client_version</: 客户端支持的版本,如0x对应TLS 1.2
random</: 字节的随机数,用于唯一标识连接
session_id</: 可选,用于会话复用,增强效率
cipher_suites</: 客户端支持的加密套件列表,如0xC0,0x代表ECDHE-RSA-AES-SHA
compression_methods</: 少数启用,现代网络通常禁用
extensions</: 可选,扩展字段,引入新特性
版本和session_id的交互至关重要,服务器通常选择与ClientHello兼容的版本。服务器响应:Server Hello与证书链
服务器通过Server Hello回应,固定cipher_suite和compression_method,同时确认客户端的扩展。证书链的呈现,如百度证书,包括根证书和中间证书,确保身份验证的完整性。关键步骤
Server Key Exchange: 基于ECDH协议交换密钥,保护通信安全
ECDH原理: 利用ECDH在保持私钥安全的同时,交换对称加密密钥,确保前向安全
OpenSSL示例: 显示服务器使用的X临时公私钥对
共享密钥生成:Pre-Master-Secret
客户端和服务器的随机数、公钥进行计算,生成Pre-Master-Secret,这是后续加密通信的基石。主密钥生成与加密策略
使用PRF函数,结合双方的随机数,生成Master Secret,用于生成不同用途的密钥,如HMAC-SHA。握手安全与数据包验证
握手阶段结束,客户端发送Client Handshake Finished,其中包含Verify Data,用于确认握手的完整性和安全性。服务器使用协商的client_write_key解密数据,确保通信的正确性。应用数据加密与TLS 1.3优化
TLS 1.3引入Key Share扩展,通过X算法进行密钥交换。应用数据使用协商的client/write key和server/write key加密,HMAC校验确保数据完整。安全升级与未来趋势
从TLS 1.2到1.3,协议不断优化,移除过时算法,引入0-RTT,提高性能。Session ID的废弃和Session Tickets的使用,为会话管理带来新策略。 在SSL/TLS的世界里,每一步加密步骤都精心设计,确保信息的安全传输。通过本文的解析,我们对这个看似复杂的协议有了更深入的理解。未来,我们还将继续关注安全研究和最新的TLS技术动态。HTTPS中的密钥交换协议
HTTPS中的密钥交换协议是实现安全通信的重要环节,主要涉及多种加密算法和协议。常用的密钥交换算法有RSA、DH、DHE、ECDHE,它们用于在两个用户间建立共享密钥,而非直接加密数据。非对称加密算法如RSA、DSA、ECDSA用于验证身份,对称加密算法如DES、AES__GCM、AES__CBC等则在密钥协商后用于数据加密。
DH密钥交换协议是Whitfield Diffie和Martin Hellman在年提出,它通过计算离散对数的复杂性确保了安全性。在HTTPS中,DH算法常与ECDHE结合使用,如ECDHE_RSA_WITH_AES__GCM_SHA,涉及椭圆曲线密码学,保证了更高的安全性。ECDHE利用临时公钥和私钥进行交换,避免了RSA中会话密钥在网络中传输的问题,提供了前向保密性,即使被截获也无法复原。
HTTPS的握手过程分为四个阶段:第一次握手,客户端发送包含版本信息和随机数的Client Hello;第二次握手,服务器确认信息并发送自己的随机数,选择合适的加密套件;第三次握手,双方生成会话密钥;第四次握手,双方确认对称密钥的正确性,开始加密通信。RSA和ECDHE的对比显示,RSA的会话密钥在网络中传输,而ECDHE则保证了更高的安全性,避免了被解密的风险。
深入理解p2p节点连接中的秘钥交换
在P2P节点连接中,秘钥交换采用了ECDHE技术。下面将介绍相关概念并附上代码实现。
迪菲-赫尔曼密钥交换协议(Diffie-Hellman key exchange,简称D-H)是一种在公共信道中安全交换秘钥的密钥协商算法,由Whitefield Diffie和Martin Hellman于年提出。它并非加解密算法,旨在让两个用户在没有对方预先信息的情况下,能在不安全的信道上建立一个共享的私钥,该私钥用于加密后续的通信数据。D-H密钥交换是一种非认证秘钥交换协议,为许多认证协议提供了基础,并在传输层临时安全中用于前向保密。
前向安全性(Forward Secrecy)是指长期使用的主密钥泄露不会导致过去的会话密钥泄露。前向安全性能够保护过去进行的通讯不受密码或密钥在未来暴露的威胁。如果系统具有前向安全性,即使密码或密钥在某时刻不慎泄露,过去已经进行的通讯依然安全,不会受到任何影响。
ECDH(Elliptic Curve Diffie-Hellman)是基于椭圆曲线Diffie-Hellman的秘钥交换协议。
ECIES(Elliptic Curve Integrated Encryption Scheme)是Certicom公司提出的公钥加密方案,可以抵御选择明文攻击和选择密文攻击。
KDF(Key derivation function)是使用伪随机函数从秘密值导出一个或多个密钥的函数。KDF可用于将密钥扩展到更长的密钥或获得所需格式的密钥。在RLPX中,使用本地随意私钥和对方随意公钥生成共享种子。
ECDHE(Ephemeral Elliptic Curve Diffie-Hellman)是临时椭圆曲线Diffie-Hellman密钥交换协议,每条会话都重新计算一个临时密钥,即使一方的私钥被泄露,过去的通信依然安全。相比ECDH,ECDHE是正向安全的。
RLPx使用了完全前向保密技术,通信双方生成随机公私钥对,交换各自本地公钥,并使用本地公钥对随机公钥加密发送到对方。使用自己的随机私钥和对方的公钥生成共享秘密,后续使用这个共享秘密AES对称加密传输的数据。即使一方的私钥被泄露,过去的通信依然安全。
秘钥共享第一阶段:发起方发消息,接收方收消息。
此时接收方秘钥已建立完成,只是对方尚未完成。
秘钥交换流程结束。双方建立连接。
握手完成,双方都会用各自得到的authMsg和respAuthMsg生成一组共享秘密。
这组共享秘密包含了双方一致认同的AES密钥和MAC密钥等。这样以后信道上传输的信息都将用这组密钥来加密解密。
共享秘密生成的过程类似于之前token产生的过程,双方都使用自己本地的随机私钥和对方的随机公钥相乘得到一个相同的密钥,再用这个密钥进行一系列Keccak加密后得到AES密钥和MAC密钥。
收发消息MAC判断:如果发送方的EgressMAC和接收方的IngressMAC不一致,消息将无法成功发送。
带你搞懂HTTPS
HTTPS相较于HTTP更安全的原因在于对称加密、非对称加密、完整性摘要、数字证书以及SSL/TLS握手等技术的应用。
HTTP协议不安全主要表现在数据容易被窃听、篡改以及伪造身份。HTTPS通过加密算法解决数据窃听问题,使用公钥加密,私钥解密,确保数据安全。
对称加密算法使用同一密钥进行加密与解密,但密钥协商过程不安全。非对称加密算法解决了密钥协商的安全问题,使用公钥加密,私钥解密,使得黑客即使获取到公钥也无法解密数据。常见的非对称加密算法有RSA和ECDHE。
为解决数据篡改问题,HTTPS引入摘要算法,将数据生成固定长度的摘要,确保数据传输过程中的完整性。常用的摘要算法有MD5、SHA-1和SHA-。客户端和服务器通过MAC报文鉴别码确保数据未被篡改。
数字证书用于验证网站身份,防止中间人攻击。浏览器通过认证中心获取公钥,用于验证网站证书的有效性。当证书无效时,浏览器会提示用户,防止风险。
SSL/TLS握手过程用于协商会话密钥、鉴别密钥以及验证证书合法性。握手过程包括四次握手,确保双方安全连接。握手报文的摘要防止信息篡改,随机数防止连接重放攻击。
HTTPS通过上述技术确保了数据传输的安全性,解决了HTTP协议的不安全问题。希望本文内容对理解HTTPS提供了帮助。