RFC 8463: Ed25519 cho Chữ ký DKIM
Tại Sao Điều Này Tồn Tại
DKIM (RFC 6376) ban đầu chỉ quy định RSA cho các chữ ký. RSA đã phục vụ tốt, nhưng nó đi kèm với chi phí:
- Khóa lớn. Khóa công khai RSA 2048-bit có kích thước khoảng 400 byte khi mã hóa Base64. Các bản ghi DNS TXT có giới hạn thực tiễn khoảng 255 byte trên mỗi chuỗi (với hầu hết các trình phân giải hỗ trợ tối đa ~4096 byte tổng cộng), làm cho các khóa RSA lớn trở nên cumbersome và đôi khi không ổn định trong DNS.
- Xác minh chậm. Xác minh chữ ký RSA, đặc biệt với các khóa lớn hơn, tiêu tốn thời gian CPU đáng kể khi người nhận xử lý hàng triệu tin nhắn mỗi giờ.
- Tăng kích thước khóa. Bảo mật RSA phụ thuộc vào độ dài khóa. Khi sức mạnh tính toán tăng lên, khóa 2048-bit cuối cùng sẽ cần trở thành 3072 hoặc 4096 bit, làm trầm trọng thêm vấn đề DNS.
Ed25519 (Thuật toán Chữ ký Kỹ thuật số Đường cong Edwards sử dụng Curve25519) giải quyết cả ba vấn đề. Các khóa 256-bit của nó cung cấp bảo mật tương đương khoảng 3072-bit RSA, khóa công khai chỉ 32 byte (44 ký tự Base64), và xác minh nhanh hơn đáng kể.
Cách Nó Hoạt Động
Ký Với Ed25519
Quá trình ký tương giống với DKIM tiêu chuẩn, với hai thay đổi: thẻ a= sử dụng ed25519-sha256 thay vì rsa-sha256, và khóa riêng là khóa Ed25519 thay vì RSA.
- Chuẩn hóa tiêu đề và nội dung theo quy tắc RFC 6376.
- Tính toán hàm băm SHA-256 của nội dung được chuẩn hóa (thẻ
bh=). - Tính toán hàm băm SHA-256 của các tiêu đề được ký cộng với hàm băm nội dung.
- Ký hàm băm tiêu đề bằng khóa riêng Ed25519.
- Phát hành tiêu đề
DKIM-Signaturevớia=ed25519-sha256.
Ví Dụ: DKIM-Signature Ed25519
Bản Ghi Khóa Công Khai DNS
Bản ghi khóa sử dụng k=ed25519 và khóa công khai nhỏ gọn hơn RSA đáng kể:
Ký Kép: Phương Pháp Được Khuyến Nghị
Không phải tất cả những người nhận đều hỗ trợ Ed25519 nhưng. RFC 8463 khuyến nghị ký kép: áp dụng cả chữ ký RSA và chữ ký Ed25519 cho mỗi tin nhắn. Những người nhận hiểu Ed25519 có thể xác minh chữ ký mạnh hơn; những người không hiểu sẽ quay lại chữ ký RSA.
Cả hai chữ ký dùng chung bh= (hàm băm nội dung) và h= (tiêu đề được ký) nhưng sử dụng các bộ chọn khác nhau chỉ đến các loại khóa khác nhau trong DNS.
Chi Tiết Kỹ Thuật Chính
So Sánh Kích Thước Khóa
| Thuộc Tính | RSA-2048 | Ed25519 |
|---|---|---|
| Mức bảo mật (bit) | ~112 | ~128 |
| Kích thước khóa công khai (Base64) | ~392 ký tự | 44 ký tự |
| Kích thước chữ ký (Base64) | ~344 ký tự | 88 ký tự |
| Tốc độ ký | Vừa phải | Nhanh |
| Tốc độ xác minh | Nhanh | Rất nhanh |
| Kích thước bản ghi DNS TXT | Khít khao, có thể cần chia nhỏ | Dễ dàng vừa trong một chuỗi |
Tạo Khóa
Định Dạng Bản Ghi DNS
Thay đổi duy nhất từ bản ghi khóa DKIM tiêu chuẩn là k=ed25519. Tất cả các thẻ khác (v=, p=, t=, v.v.) hoạt động như trước với bản ghi khóa RSA:
Hành Động Của Người Nhận
Khi người nhận gặp a=ed25519-sha256 trong DKIM-Signature:
- Tra cứu bản ghi khóa DNS cho bộ chọn.
- Xác nhận
k=ed25519trong bản ghi khóa. - Giải mã khóa công khai 32 byte từ thẻ
p=. - Xác minh chữ ký Ed25519 so với hàm băm SHA-256 của các tiêu đề được chuẩn hóa.
Nếu người nhận không hỗ trợ Ed25519, họ coi chữ ký là không thể xác minh (không phải lỗi nghiêm trọng) và chuyển sang bất kỳ tiêu đề DKIM-Signature nào khác trên tin nhắn.
Những Lỗi Phổ Biến
- Triển khai chỉ Ed25519 mà không ký kép. Nhiều người nhận vẫn không xác minh chữ ký Ed25519. Loại bỏ RSA có nghĩa là những người nhận đó không thấy chữ ký DKIM hợp lệ, điều này làm tổn hại đến sự DMARC căn chỉnh và khả năng gửi.
-
Trích xuất khóa không chính xác. Khóa công khai Ed25519 ở định dạng PEM bao gồm tiền tố ASN.1. Giá trị
p=DNS phải là khóa 32 byte thô, không phải toàn bộ SubjectPublicKeyInfo được mã hóa DER. Sai sót này tạo ra khóa trông hợp lệ nhưng xác minh không thành công. - Sử dụng phiên bản OpenSSL cũ. Hỗ trợ Ed25519 được thêm vào OpenSSL 1.1.1 (Tháng 9 năm 2018). Các phiên bản cũ hơn không thể tạo hoặc xác minh khóa Ed25519. Nhiều bản phân phối Linux đã gửi OpenSSL cũ hơn cho đến tận năm 2020.
- Giả định Ed25519 thay thế RSA ngày hôm nay. Ed25519 là hướng phát triển trong tương lai, nhưng RSA vẫn là cơ sở mà mọi trình xác minh DKIM đều hiểu. Lên kế hoạch ký kép ít nhất trong vài năm tới.
-
Không kiểm tra xác minh. Sau khi công bố bản ghi DNS, hãy gửi các tin nhắn thử nghiệm và xác minh rằng cả hai chữ ký đều xác thực được. Các công cụ như
opendkim-testkeycó thể kiểm tra bản ghi DNS một cách độc lập. - Chia sẻ bộ chọn giữa các loại khóa. Sử dụng các bộ chọn riêng biệt cho khóa RSA và Ed25519. Bộ chọn chỉ có thể chỉ đến một loại khóa. Cố gắng quá tải một bộ chọn duy nhất gây ra lỗi xác minh.
Tác Động Đến Khả Năng Gửi
- Dấu chân DNS nhỏ hơn. Khóa Ed25519 dễ dàng vừa trong bản ghi DNS TXT, loại bỏ các vấn đề phân mảnh đôi khi gây khó khăn cho các khóa RSA lớn. Ít lỗi DKIM liên quan đến DNS hơn có nghĩa là xác thực nhất quán hơn.
- Hướng tương lai. Khi kích thước khóa RSA cần tăng lên (2048 → 3072 → 4096), vấn đề DNS trở nên tồi tệ hơn. Ed25519 cung cấp bảo mật mạnh hơn mà không cần tăng kích thước khóa.
- Xác minh nhanh hơn quy mô lớn. Đối với những người nhận xử lý lượng lớn, những người nhận xử lý hàng tỷ tin nhắn, xác minh Ed25519 nhanh hơn đáng kể so với RSA. Điều này có lợi cho hệ sinh thái bằng cách giảm chi phí tính toán của xác thực.
- Chứng minh trưởng thành bảo mật. Triển khai ký kép Ed25519 dual chỉ ra rằng người gửi chủ động duy trì cơ sở hạ tầng xác thực của họ. Mặc dù đây không phải là yếu tố chấm điểm trực tiếp, nhưng nó phản ánh trưởng thành hoạt động có liên quan đến các thực hành gửi tốt.
- Ký kép như lưới an toàn. Với hai chữ ký độc lập, một tin nhắn có hai cơ hội để vượt qua xác minh DKIM. Nếu một chữ ký bị hỏng do sửa đổi tin nhắn trung gian, chữ ký khác có thể sống sót.