it-swarm-vi.com

Làm thế nào để các quy trình cho chứng chỉ kỹ thuật số, chữ ký và ssl hoạt động?

Tôi đã cố gắng để hiểu làm thế nào ssl hoạt động. Thay vì Alice và Bob, hãy xem xét giao tiếp giữa máy khách và máy chủ. Máy chủ có chứng chỉ kỹ thuật số có được từ CA. Nó cũng có khóa công khai và riêng tư. Máy chủ muốn gửi tin nhắn đến Client. Khóa công khai của máy chủ đã có sẵn cho khách hàng.

Giả sử rằng bắt tay ssl đã hoàn thành.

Máy chủ đến máy khách:

  • Máy chủ đính kèm khóa công khai của nó vào tin nhắn.
  • Chạy hàm băm trên (tin nhắn + khóa chung). Kết quả được gọi là HMAC.
  • Mã hóa HMAC bằng khóa riêng của nó. Kết quả được gọi là chữ ký số.
  • Gửi cho khách hàng cùng với chứng chỉ kỹ thuật số.
  • Khách hàng kiểm tra chứng chỉ và thấy rằng nó từ Máy chủ dự kiến.
  • Giải mã HMAC bằng khóa chung của Máy chủ.
  • Chạy hàm băm trên (tin nhắn + khóa chung) để có được tin nhắn gốc.

Máy khách đến máy chủ

  • Máy khách chạy hàm băm trên (tin nhắn + khóa chung) và sau đó mã hóa bằng cùng một khóa chung.
  • Máy chủ giải mã bằng khóa riêng, chạy hàm băm trên dữ liệu kết quả để có được thông báo.

Xin vui lòng cho tôi biết nếu sự hiểu biết của tôi là chính xác.

27
John

Có một vài nhầm lẫn trong bài viết của bạn. Trước hết, HMAC không phải là hàm băm . Tìm hiểu thêm về HMAC sau này.

Hàm băm

A hàm băm là một thuật toán hoàn toàn công khai (không có khóa nào trong đó) kết hợp các bit theo cách thực sự không thể gỡ rối: bất kỳ ai cũng có thể chạy hàm băm trên bất kỳ dữ liệu nào, nhưng tìm thấy dữ liệu trở lại từ đầu ra băm dường như vượt xa trí thông minh của chúng tôi. Đầu ra băm có kích thước cố định, thường là 256 bit (với SHA-256) hoặc 512 bit (với SHA-512). Hàm SHA- * tạo ra 160 bit được gọi là SHA-1, không phải SHA-160, bởi vì các nhà mật mã để lại các thiết bị của riêng họ có thể duy trì hợp lý chỉ trong thời gian dài đó và chắc chắn không vượt quá pint thứ năm.

Thuật toán chữ ký

A chữ ký thuật toán sử dụng một cặp khóa, được liên kết toán học với nhau, khóa riêng khóa chung ( tính toán lại khóa riêng từ khóa chung là khả thi về mặt lý thuyết nhưng quá khó thực hiện, ngay cả với Máy tính thực sự lớn, đó là lý do tại sao khóa chung và được đặt ở chế độ công khai trong khi khóa riêng vẫn ở chế độ riêng tư). Sử dụng cấu trúc toán học của các khóa, thuật toán chữ ký cho phép:

  • to tạo chữ ký trên một số dữ liệu đầu vào, sử dụng khóa riêng (chữ ký là một đối tượng toán học nhỏ gọn hợp lý, ví dụ: vài trăm byte cho chữ ký RSA điển hình);
  • to verify chữ ký trên một số dữ liệu đầu vào, sử dụng khóa chung. Việc xác minh lấy tham số chữ ký, dữ liệu đầu vào và khóa chung và trả về "hoàn hảo, người đàn ông!" hoặc "anh chàng, những điều này không phù hợp".

Đối với thuật toán chữ ký an toàn, được cho là không thể tạo ra giá trị chữ ký và dữ liệu đầu vào sao cho thuật toán xác minh với khóa chung đã cho là "tốt", trừ khi bạn biết khóa riêng tương ứng, trong trường hợp đó là dễ dàng và hiệu quả. Lưu ý bản in đẹp: không có khóa riêng, bạn không thể tạo ra một số dữ liệu một giá trị chữ ký hoạt động với khóa chung, ngay cả khi bạn có thể chọn dữ liệu và chữ ký theo ý muốn.

"Được cho là không khả thi" có nghĩa là tất cả các nhà mật mã thông minh trên thế giới đã làm việc với nó trong nhiều năm và chưa tìm ra cách để làm điều đó, ngay cả sau lần thứ năm.

Hầu hết (thực tế, tất cả) các thuật toán chữ ký bắt đầu bằng cách xử lý dữ liệu đầu vào bằng hàm băm, và sau đó chỉ làm việc trên giá trị băm. Điều này là do thuật toán chữ ký cần các đối tượng toán học trong một số bộ đã cho có kích thước giới hạn, vì vậy chúng cần hoạt động trên các giá trị "không quá lớn", chẳng hạn như đầu ra của hàm băm. Do tính chất của hàm băm, mọi thứ hoạt động tốt (ký kết đầu ra băm cũng tốt như ký kết đầu vào băm).

Trao đổi khóa và mã hóa bất đối xứng

A giao thức trao đổi khóa là giao thức trong đó cả hai bên ném các đối tượng toán học vào nhau, mỗi đối tượng có thể được liên kết với một số giá trị bí mật mà chúng giữ cho chúng, theo cách tương tự như công khai/cặp khóa riêng. Khi kết thúc trao đổi khóa, cả hai bên có thể tính toán một "giá trị" chung (một đối tượng toán học khác) hoàn toàn lảng tránh sự nắm bắt của bất cứ ai quan sát các bit được trao đổi trên dây. Một loại thuật toán trao đổi khóa phổ biến là mã hóa bất đối xứng. Mã hóa bất đối xứng sử dụng cặp khóa công khai/riêng tư (không nhất thiết phải cùng loại với thuật toán chữ ký):

  • Với khóa chung, bạn có thể mã hóa một phần dữ liệu. Dữ liệu đó thường bị hạn chế về kích thước (ví dụ: không quá 117 byte cho RSA với khóa công khai 1024 bit). Kết quả mã hóa là, đoán xem, một đối tượng toán học có thể được mã hóa thành một chuỗi byte.
  • Với khóa riêng, bạn có thể giải mã, tức là thực hiện thao tác ngược và khôi phục dữ liệu đầu vào ban đầu. Người ta cho rằng không có khóa riêng, may mắn khó khăn.

Sau đó, giao thức trao đổi khóa chạy như vậy: một bên chọn một giá trị ngẫu nhiên (một chuỗi các byte ngẫu nhiên), mã hóa nó bằng khóa chung của trình duyệt và gửi cho anh ta giá trị đó. Người ngang hàng sử dụng khóa riêng của mình để giải mã và phục hồi giá trị ngẫu nhiên, đó là bí mật chung.

Một lời giải thích lịch sử về chữ ký là: "mã hóa bằng khóa riêng, giải mã bằng khóa chung". Quên lời giải thích đó. Đó là sai. Nó có thể chỉ đúng với một thuật toán cụ thể (RSA), và một lần nữa, chỉ đối với một phiên bản RSA bị khốn hạ mà thực sự không có bất kỳ bảo mật tốt nào. Vì vậy không , chữ ký điện tử không phải là mã hóa bất đối xứng "ngược lại".

Mật mã đối xứng

Khi hai bên có giá trị bí mật chung, họ có thể sử dụng mật mã đối xứng để trao đổi thêm dữ liệu theo cách bí mật. Nó được gọi là đối xứng vì cả hai bên đều có cùng một khóa, tức là có cùng kiến ​​thức, tức là có cùng sức mạnh. Không có sự phân đôi riêng tư/công cộng. Hai nguyên thủy được sử dụng:

  • Mã hóa đối xứng : cách xáo trộn dữ liệu và tháo gỡ dữ liệu sau này.
  • Mã xác thực tin nhắn : "tổng kiểm tra có khóa": chỉ những người biết khóa bí mật mới có thể tính MAC trên một số dữ liệu (nó giống như một thuật toán chữ ký trong đó khóa riêng và khóa chung giống nhau - vì vậy khóa "công khai" tốt hơn là không công khai!).

HMAC là một loại MAC được xây dựng trên các hàm băm theo cách thông minh, bởi vì có nhiều cách không thông minh để thực hiện và thất bại do chi tiết tinh tế về những gì hàm băm cung cấp và không cung cấp.

Chứng chỉ

A chứng chỉ là nơi chứa khóa công khai. Với các công cụ được giải thích ở trên, người ta có thể bắt đầu hình dung rằng máy chủ sẽ có khóa chung, ứng dụng khách sẽ sử dụng để thực hiện trao đổi khóa với máy chủ. Nhưng làm thế nào để khách hàng chắc chắn rằng anh ta đang sử dụng khóa công khai của máy chủ, chứ không phải của kẻ tấn công quỷ quyệt, một kẻ xấu xa giả mạo máy chủ? Đó là nơi chứng chỉ phát huy tác dụng. Chứng chỉ là đã ký bởi một người chuyên xác minh danh tính vật lý; nó được gọi là a Tổ chức phát hành chứng chỉ. CA gặp máy chủ "trong đời thực" (ví dụ: trong một thanh), xác minh danh tính máy chủ, lấy khóa công khai của máy chủ từ chính máy chủ và ký toàn bộ lô (nhận dạng máy chủ khóa công khai). Điều này dẫn đến một gói tiện lợi được gọi là chứng chỉ. Chứng chỉ thể hiện sự bảo đảm bởi CA rằng tên và khóa chung khớp với nhau (hy vọng, CA không quá tin cậy, vì vậy bảo đảm là đáng tin cậy - tốt nhất là CA không not ký chứng chỉ sau pint thứ năm của nó).

Máy khách, khi nhìn thấy chứng chỉ, có thể xác minh chữ ký trên chứng chỉ tương đối với khóa chung CA, và do đó có được sự tin tưởng rằng khóa công khai của máy chủ thực sự thuộc về máy chủ dự định.

Nhưng, bạn sẽ cho tôi biết, những gì chúng ta đã đạt được? Chúng ta vẫn phải biết một khóa công khai, cụ thể là khóa chung CA. Làm thế nào để chúng tôi xác minh rằng một? Chà, chúng ta có thể sử dụng khác CA. Điều này chỉ di chuyển vấn đề xung quanh, nhưng nó có thể kết thúc với vấn đề biết một tiên nghiệm một khóa duy nhất hoặc một số khóa công khai từ über-CA không được ký bởi bất kỳ ai khác. Thiết nghĩ, Microsoft đã nhúng khoảng một trăm "khóa công khai gốc" như vậy (còn gọi là "mỏ neo tin cậy") vào sâu trong chính Internet Explorer. Đây là nơi niềm tin bắt nguồn (chính xác, bạn đã mất cơ sở của niềm tin vào công ty Redmond - bây giờ bạn đã hiểu Bill Gates trở thành người giàu nhất thế giới như thế nào chưa?).

[~ # ~] ssl [~ # ~]

Bây giờ, hãy kết hợp tất cả lại, trong giao thức SSL, hiện được gọi là TLS ("SSL" là tên giao thức khi nó là thuộc tính của Netscape Tập đoàn).

Khách hàng muốn nói chuyện với máy chủ. Nó sẽ gửi một tin nhắn ("ClientHello") chứa một loạt dữ liệu quản trị, chẳng hạn như danh sách các thuật toán mã hóa mà máy khách hỗ trợ.

Máy chủ trả lời ("ServerHello") bằng cách cho biết thuật toán nào sẽ được sử dụng; sau đó máy chủ gửi chứng chỉ của anh ấy ("Chứng chỉ"), có thể với một vài chứng chỉ CA trong trường hợp khách hàng có thể cần chúng (không phải chứng chỉ gốc, mà là chứng chỉ trung gian, chứng chỉ CA).

Máy khách xác nhận chứng chỉ máy chủ và trích xuất khóa công khai của máy chủ từ nó. Máy khách tạo một giá trị ngẫu nhiên ("bí mật tiền chính"), mã hóa nó bằng khóa chung của máy chủ và gửi đó đến máy chủ ("ClientKeyExchange").

Máy chủ giải mã tin nhắn, lấy tiền gốc và lấy từ các khóa bí mật để mã hóa đối xứng và MAC. Các khách hàng thực hiện tính toán tương tự.

Khách hàng gửi một thông báo xác minh ("Hoàn tất") được mã hóa và MAC với các khóa dẫn xuất. Máy chủ xác minh rằng tin nhắn Hoàn thành là đúng và gửi tin nhắn "Hoàn thành" của chính nó để phản hồi. Tại thời điểm đó, cả máy khách và máy chủ đều có tất cả các khóa đối xứng mà chúng cần và biết rằng "bắt tay" đã thành công. Dữ liệu ứng dụng (ví dụ: yêu cầu HTTP) sau đó được trao đổi, sử dụng mã hóa đối xứng và MAC.

Không có khóa công khai hoặc chứng chỉ liên quan đến quá trình bắt tay. Chỉ cần mã hóa đối xứng (ví dụ: 3DES, AES hoặc RC4) và MAC (thông thường là HMAC với SHA-1 hoặc SHA-256).

38
Tom Leek

Sau nhiều đấu tranh. Tôi có những hiểu biết dưới đây về sự khác biệt giữa SSL, mã hóa khóa bất đối xứng, Chứng chỉ số (DC) và Chữ ký số (DS).

Chứng chỉ số là gì, còn được gọi là chứng chỉ khóa chung?

DC là một tài liệu điện tử sử dụng chữ ký số để liên kết khóa công khai với thông tin nhận dạng như tên, địa chỉ, v.v.

Nội dung chứng chỉ: Chứng chỉ khóa công khai

Quan trọng nhất là, Thuật toán chữ ký, tổ chức phát hành và khóa công khai.

Mã hóa khóa bất đối xứng và chữ ký số là gì?

Giải thích bằng một ví dụ.

Cả hai máy đều có một cặp khóa mật mã - khóa mã hóa công khai và khóa giải mã riêng.

Máy A có quyền truy cập vào khóa công khai và chứng chỉ của Máy B.
[.__.] Máy-B có quyền truy cập vào khóa công khai và chứng chỉ của Máy-A.

Máy-A đến Máy-B

Tại máy-A:

  • Hash_function (Dữ liệu) = Hash
  • Mã hóa (Hash) bằng khóa riêng của Machine-A = DS
  • Đính kèm dữ liệu vào DS và DC = Dữ liệu + DS + DC
  • Mã hóa (Dữ liệu + DS + DC) bằng khóa chung của Machine-B.
  • Gửi cho Máy-B.

Tại máy-B:

  • Giải mã (Dữ liệu + DS + DC) bằng khóa riêng của Machine-B.
  • Xác minh DC để xác thực Máy-A.
  • Giải mã (DS) bằng khóa chung của Machine-A = Hash # 1
  • Hash_function (Dữ liệu) = Hash # 2
  • if (Hash # 1 == Hash # 2) Dữ liệu và chữ ký hợp lệ.

Máy-B đến Máy-A

Quá trình bây giờ chính xác là đảo ngược của ở trên.

SSL/TLS là gì?

Giao thức TLS cho phép các ứng dụng khách/máy chủ giao tiếp qua mạng theo cách được thiết kế để ngăn chặn việc nghe lén và giả mạo. Trong hầu hết các giao tiếp Máy khách-Máy chủ, chỉ Máy chủ cần được xác thực. TLS hợp lý hóa mã hóa khóa bất đối xứng để sử dụng hiệu quả hiện tượng này. Lớp cổng bảo mật

Ví dụ máy khách và máy chủ.

Máy chủ có chứng chỉ kỹ thuật số có được từ CA. Nó cũng có khóa công khai và riêng tư.

Người dùng nhấp vào một URL bắt đầu bằng

https: //

Một kết nối an toàn là cần thiết cho phiên này. Trình duyệt thiết lập kết nối TCP trên HTTPS TCP Cổng 443.

  1. Máy khách> Máy chủ: SYN
  2. Máy khách <Máy chủ: SYN + ACK
  3. Máy khách> Máy chủ: ACK

    Bắt tay SSL trên kết nối mới TCP:

  4. Máy khách> Máy chủ: CLIENT_HELLO

    Máy khách gửi lệnh CLIENT_HELLO đến máy chủ, bao gồm:

    • Phiên bản SSL và TLS cao nhất được hỗ trợ bởi khách hàng.
    • Mật mã được hỗ trợ bởi khách hàng. Các mật mã được liệt kê theo thứ tự ưu tiên.
    • Phương pháp nén dữ liệu được hỗ trợ bởi khách hàng.
    • ID phiên. Nếu khách hàng đang bắt đầu phiên SSL mới, ID phiên là 0.
    • Dữ liệu ngẫu nhiên được tạo bởi khách hàng để sử dụng trong quá trình tạo khóa.
  5. Máy khách <Máy chủ: SERVER_HELLO

    Máy chủ gửi lệnh SERVER_HELLO đến máy khách, bao gồm:

    • Phiên bản SSL hoặc TLS sẽ được sử dụng cho phiên SSL.
    • Các mật mã sẽ được sử dụng cho phiên SSL.
    • Phương pháp nén dữ liệu sẽ được sử dụng cho phiên SSL.
    • ID phiên cho phiên SSL.
    • Dữ liệu ngẫu nhiên được tạo bởi máy chủ để sử dụng trong quá trình tạo khóa.
  6. Máy khách <Máy chủ: CHỨNG NHẬN (KHÓA CÔNG CỘNG)

    Máy chủ sẽ gửi lệnh CHỨNG NHẬN. Nó bao gồm chứng chỉ máy chủ.

  7. Máy khách <Máy chủ: SERVER_DONE

    Máy chủ gửi lệnh SERVER_DONE. Lệnh này chỉ ra rằng máy chủ đã hoàn thành giai đoạn bắt tay SSL này.

  8. Máy khách> Máy chủ: CERTIFICATE_VERIFY

    Khách hàng thông báo cho máy chủ rằng nó đã xác minh chứng chỉ của máy chủ

  9. Máy khách> Máy chủ:

    Sử dụng tất cả dữ liệu được tạo trong bắt tay cho đến nay, máy khách (với sự hợp tác của máy chủ, tùy thuộc vào mật mã được sử dụng) tạo ra bí mật tiền chính cho phiên, mã hóa nó bằng khóa chung của máy chủ (lấy từ chứng chỉ của máy chủ ), và sau đó gửi bí mật tiền mã hóa đến máy chủ.

    Máy chủ sử dụng khóa riêng của nó để giải mã bí mật tiền chính, và sau đó thực hiện một loạt các bước để tạo bí mật chính.

    Khách hàng cũng thực hiện một loạt các bước tương tự trên bí mật trước chủ để tạo cùng một bí mật chính.

    Lưu ý: Trong trường hợp máy khách cần được xác thực, máy khách cũng ký một đoạn dữ liệu khác duy nhất cho cái bắt tay này và được cả máy khách và máy chủ biết. Trong trường hợp này, máy khách sẽ gửi cả dữ liệu đã ký và chứng chỉ riêng của máy khách đến máy chủ cùng với bí mật tiền mã hóa được mã hóa.

  10. Máy khách <> Máy chủ:

    Cả máy khách và máy chủ đều sử dụng bí mật chính để tạo các khóa phiên, là các khóa đối xứng được sử dụng để mã hóa và giải mã thông tin trao đổi trong phiên SSL và để xác minh tính toàn vẹn của nó.

    Lưu ý: Từ giờ trở đi, mã hóa khóa đối xứng.

  11. Máy khách> Máy chủ:

    Máy khách gửi một tin nhắn đến máy chủ thông báo rằng các tin nhắn trong tương lai từ máy khách sẽ được mã hóa bằng khóa phiên.

  12. Máy khách> Máy chủ: HOÀN TẤT

    Sau đó, khách hàng sẽ gửi một tin nhắn (được mã hóa) riêng cho biết rằng phần bắt tay đã kết thúc.

  13. Máy khách <Máy chủ:

    Máy chủ gửi tin nhắn cho khách hàng thông báo rằng các tin nhắn trong tương lai từ máy chủ sẽ được mã hóa bằng khóa phiên.

  14. Máy khách <Máy chủ: HOÀN TẤT

    Máy chủ gửi một tin nhắn (được mã hóa) riêng cho biết rằng phần bắt tay đã kết thúc.

    Bắt tay SSL hiện đã hoàn tất và phiên bắt đầu. Máy khách và máy chủ sử dụng các khóa phiên để mã hóa và giải mã dữ liệu chúng gửi cho nhau và để xác thực tính toàn vẹn của nó.

4
John

Để giải thích chi tiết hơn "dưới mui xe", tôi cũng có thể đề xuất bài viết sau: Vài giây đầu tiên của kết nối HTTPS của Jeff Moser. Bài viết này sử dụng các gói chụp của phiên giao tiếp HTTPS để minh họa cách thức giao thức hoạt động. Thật thú vị khi thấy những điều chúng ta đang nói về hành động và nó xóa đi nhiều điểm "đen tối".

2
George

Không hẳn; các chứng chỉ chỉ có hiệu lực trong quá trình bắt tay SSL ban đầu hoặc trong quá trình đàm phán lại SSL. Sau đó, một mật mã đối xứng như AES, (3) DES hoặc RC4 sẽ được sử dụng. Tiền điện tử khóa công khai thường đắt hơn tiền điện tử đối xứng, do đó, nó thường được sử dụng để thống nhất về khóa đối xứng lúc đầu.

1
Steve Dispensa