Table of Contents
Những người được đề nghị xây dựng một giao thức liên lạc an toàn ở C
Trước khi lặn vào thực hiện, đảm bảo môi trường phát triển của bạn bao gồm trình biên dịch C. Trên Linux, việc cài đặt OpenSSL cơ bản qua gói (v. d., [FL: 0]. Trên Windows, hãy sử dụng các tập tin lỗi chính tả hoặc xây dựng từ nguồn. Tính năng tương thích với máy chủ và mô hình trình phục vụ cũng được giả sử.
Hiểu được các khối xây cất mật mã
Một giao thức liên lạc an toàn nằm trên ba cột: bảo mật, tính trung thực và xác thực. Tính bảo mật được đạt được qua mã hóa, đảm bảo rằng chỉ người nhận có thể đọc thông điệp. Tính trung thực đảm bảo dữ liệu không bị thay đổi trong quá trình lưu. Xác thực xác định danh tính của các nhóm liên lạc. Trong một giao thức tùy chỉnh, bạn thường kết hợp mã đối xứng, có mã hóa thư (HMAC) và một cơ chế trao đổi chủ chốt như là HTMLie–Hllman.
Mã hóa đối xứng với AES
Mật mã cấp cao là mật mã đối xứng được sử dụng rộng rãi nhất. Nó hoạt động trên các khối 128- bit và hỗ trợ kích cỡ quan trọng của 128, 192 bit, hoặc 246 bit. Để truyền thông an toàn, hãy tránh chế độ AES trong Galois/Counter (GCM), mà cung cấp cả sự bảo mật lẫn toàn trong một thao tác. Giao diện của OpenSSL’s EVP làm cho nó dễ dàng để mã hóa và giải mã nó với hệ thống AESGM. Tránh chế độ cũ như ECBB hay CBC, trừ khi kết hợp với khả năng xác thực và xác thực.
Tráo đổi khóa với–Hellman
Để chắc chắn đồng ý một bí mật chia sẻ trên kênh uncined, sử dụng bộ giao tiếp phím của người khác (DH). Cả hai bên đều tạo ra các phím riêng tư và trao đổi tham số công cộng, sau đó tính toán một bí mật chung. [FLT: 0] Diffie–Hleman dễ bị người đàn ông tấn công nếu không được xác nhận, vì vậy bạn có thể mở rộng nó với các phím ký hiệu kỹ thuật số hoặc các phím đã được chia sẻ trước. Để sử dụng, hãy xem xét việc sử dụng epheliepheal–H: 1] để bí mật hoàn toàn.
Thông điệp thanh liêm và xác thực với HMAC
Để xác minh rằng một thông điệp chưa bị thay đổi, phụ thêm một mã thông điệp dựa trên HMAC (HMAC) vào mỗi văn bản mật mã đã được mã hóa. HMAC sử dụng một mã hoá chia sẻ và một chức năng hath hath (v. d., chia sẻ với nhau một thẻ có cùng mục đích, đơn giản hóa giao thức.
Thiết lập phần mở rộng trong dự án C
OpenSSL đòi hỏi sự khởi đầu cẩn thận. Bao gồm những người dẫn đầu và gọi và ) lúc bắt đầu chương trình. Để xử lý lỗi, hãy dùng và . Khi liên kết, hãy thêm cờ biên dịch. Một thiết lập tối thiểu trông như thế này:
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/err.h>
// Initialize OpenSSL
void init_openssl() {
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
}
Xây dựng lớp băng TCP
Phương tiện cơ bản cho giao thức của bạn sẽ là TCP, cung cấp tin cậy, sắp xếp. Tạo một máy chủ lắng nghe kết nối đến và một trình khách khởi động bắt tay. Hãy dùng các ổ cắm chuẩn PSIX , , [FLT: 9, [FLT: 9,], [FL:10] bên máy phục vụ, và [FL:11], [FL:12] bên ứng dụng khách. Hãy nhớ xử lý lỗi và descripts gần.
Name
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len);
Name
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
Thi hành giao dịch Key Hellman
Sau khi thiết lập kết nối TCP, khách và máy chủ thực hiện một giao diện phím DH. Mỗi bên tạo ra một cặp khóa bằng cách dùng nhóm nguyên tố với các tham số [FL:18]. Trong một giao thức thật, bạn sẽ thương lượng hoặc xác định nhóm.
// Generate DH parameters
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL);
EVP_PKEY_paramgen_init(pctx);
EVP_PKEY_CTX_set_dh_paramgen_prime_len(pctx, 2048);
EVP_PKEY *params = NULL;
EVP_PKEY_paramgen(pctx, ¶ms);
// Generate key pair
EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new(params, NULL);
EVP_PKEY_keygen_init(kctx);
EVP_PKEY *my_key = NULL;
EVP_PKEY_keygen(kctx, &my_key);
// Export public key to send
unsigned char *pub_key_der = NULL;
int pub_len = i2d_PUBKEY(my_key, &pub_key_der);
send(sock, pub_key_der, pub_len, 0);
Khi nhận kết thúc, người nhập khẩu chung chìa khóa công cộng bằng và rồi lấy được bí mật chung. Bí mật xuất phát có thể bị phá hủy (v. d., với fun286) để tạo ra một chìa khóa đồng nhất cho AES và HMAC.
Giải mã và giải mã thông điệp bằng AESGCM
AESGCM là chế độ ưa thích vì nó cung cấp một danh sách mã hóa và một thẻ xác thực trong một thao tác. Dùng mã nguồn của . Bạn cần một lệnh 12 hệ thống mật mã và khóa 2V] được lấy từ bộ mã DH. Văn bản được tạo ra trong đoạn, và sau khi cập nhật cuối cùng, bạn lấy thẻ 16- đơn vị. Không gửi kèm theo thẻ mật mã. Việc nhận thẻ [L: 23] và thẻ giải mã bị từ chối. Nếu thẻ bị từ chối, thẻ bị từ chối. Nếu thẻ bị từ chối, thẻ bị từ chối.
// Encryption
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, nonce);
unsigned char ciphertext[1024];
int outlen;
EVP_EncryptUpdate(ctx, ciphertext, &outlen, plaintext, len);
int tmplen;
EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen);
unsigned char tag[16];
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag);
Thêm nội dung vào thẻ HMAC (hay Levering GCM)
Nếu bạn chọn không sử dụng AESGCM, bạn có thể mã hoá với AESCBC và sau đó tính toán HMAC trên văn bản mật mã. Dùng từ OpenSSL với fum256. Phụ lục HMAC sau khi giải mã. Cách tiếp cận này đòi hỏi hai phím: một cho mã hoá, một cho HMAC. Derive từ bí mật dùng chức năng phân hủy (DFD) như HKD. Tuy nhiên, AGMM loại bỏ các lỗi phức tạp, và giảm thiểu khả năng mật.
Cùng nhau làm việc: Hết công việc
- Thiết lập kết nối TCP giữa máy chủ và ứng dụng khách.
- Cả hai bên tạo ra cặp chìa khóa của nhóm Hellman.
- Tráo đổi phím công cộng và tính toán bí mật chung.
- Derive chìa khóa 246 bit AES và chìa khóa 257bit HMAC (hoặc dùng chìa khóa tương tự cho GCM).
- Khách hàng gửi một danh sách (12 byte ngẫu nhiên) và rồi các AESGCM mã hóa tin nhắn cộng với thẻ.
- Máy phục vụ gửi một hồi đáp bằng cách dùng một từ mới (không bao giờ dùng lại các từ « liên lạc » với cùng phím).
- Cả hai bên có thể tiếp tục trao đổi tin nhắn; trong những phiên họp dài, việc lặp lại một cách định kỳ bằng cách dùng cùng một cái bắt tay DH hoặc một cơ chế chuột.
Những thực hành tốt nhất về an ninh
- Dùng số máy phát ngẫu nhiên mạnh. ) Gọi từ OpenSSL để tạo ra các phím, danh sách, và phím riêng. Không bao giờ dùng hoặc cho mục đích giải mã.
- Máy phát điện tất cả dữ liệu đã nhận. Kiểm tra độ dài, tham số phím công cộng (v. d., bảo đảm p là số nguyên tố, g là một máy phát điện), và thẻ HMAC trước khi xử lý.
- Không có phím đã mã hóa hay mặc định. Luôn luôn thương lượng phím tươi mỗi phiên chạy để cung cấp bí mật hoàn hảo về phía trước.
- lỗi lỗi một cách duyên dáng. ) Nếu giải mã thất bại hoặc HMAC không thể xác nhận, hãy đóng kết nối và ghi lại sự kiện. Đừng cho biết tại sao lỗi xảy ra.
- Giữ các quan hệ phụ thuộc cập nhật. Cập nhật đều đặn; để vá các điểm yếu đã biết. Tài liệu hướng dẫn cung cấp hướng dẫn về sự phân hủy và thực hành tốt nhất.
- Xem xét bằng cách sử dụng hệ thống kiểu MIME thay vì giao thức tùy chỉnh. Để tạo hệ thống sản xuất, hãy dựa vào các giao thức thử nghiệm tốt như TLLLT. Xây dựng một giao thức tự chọn từ đầu là lỗi chính tả và không khuyến khích nếu bạn không có chuyên môn mật mã sâu.
Thử thách giao thức
Thử nghiệm thực hiện của bạn bằng cách chạy trình khách và máy phục vụ trên cùng máy (máy tính) và xác nhận rằng thông điệp giải mã đúng. Giới thiệu lỗi như thay đổi ngữ cảnh mật mã hay cách gọi không hợp lệ để đảm bảo giao thức này bị từ chối. Hãy dùng công cụ như Wireshark để kiểm tra các dữ liệu giao thông thô và xác nhận rằng không hiển thị được. Đối với đơn vị thử nghiệm, hãy thử nghiệm lớp ổ cắm và phần mã hóa riêng lẻ. Việc sửa lỗi OpenSSL [FL:29] có thể xác nhận giá trị trung lập khớp với kết xuất.
Kết luận
Xây dựng một giao thức liên lạc an toàn ở C là một bài tập học tuyệt vời, nhưng cần phải có sự chú ý kỹ lưỡng đến chi tiết. Để sử dụng cách giải mã thông tin ngẫu nhiên được chứng minh của OpenSSL, AESGCM, và HMAC, bạn có thể tạo một hệ thống cung cấp sự bảo mật, chính xác và xác thực. Luôn luôn theo các thực hành ngẫu nhiên: sử dụng các phím phiên chạy có tính ngẫu nhiên, lấy ra với KDF, không bao giờ sử dụng lại từ không, và xác nhận chặt chẽ tất cả các dữ liệu. Để có bất cứ điều gì ngoài dự án học tập, hãy xem xét một giao thức chuẩn như [FL: 0], [TS], [TL], 1], mà đã được phát triển để tiếp tục cập nhật và tiếp tục cập nhật các mối đe dọa.