Điểm:2

Dẫn xuất khóa v4 chữ ký AWS

lá cờ ht

Tạo tiêu đề Ủy quyền với chữ ký AWS v4 liên quan đến việc lấy khóa ký như sau:

https://docs.aws.amazon.com/General/latest/gr/signature-v4-examples.html

byte tĩnh [] HmacSHA256 (Dữ liệu chuỗi, khóa byte []) ném Ngoại lệ {
    Thuật toán chuỗi="HmacSHA256";
    Mac mac = Mac.getInstance(thuật toán);
    mac.init(SecretKeySpec mới(khóa, thuật toán));
    trả về mac.doFinal(data.getBytes("UTF-8"));
}

byte tĩnh [] getSignatureKey (Khóa chuỗi, Chuỗi dateStamp, Chuỗi vùng Tên, Chuỗi dịch vụ Tên) ném Ngoại lệ {
    byte[] kSecret = ("AWS4" + key).getBytes("UTF-8");
    byte[] kDate = HmacSHA256(dateStamp, kSecret);
    byte[] kRegion = HmacSHA256(tên vùng, kDate);
    byte[] kService = HmacSHA256(tên dịch vụ, kRegion);
    byte[] kSigning = HmacSHA256("aws4_request", kService);
    trả lại kSigning;
}
  1. Lợi ích của việc tính toán HMAC như được hiển thị ở trên, trong nhiều bước tiếp theo, thay vì chỉ thực hiện một phép tính HmacSHA256 đối với đầu vào được nối (dateStamp, regionName và serviceName) là gì?
  2. Lợi ích của phương pháp trên thay vì sử dụng HKDF tiêu chuẩn là gì?
Điểm:3
lá cờ cn

Lược đồ so le cho phép mỗi bước được thực hiện bởi một thực thể khác nhau.

  1. Một máy chủ trung tâm lưu trữ khóa chính và không truyền nó cho bất kỳ ai khác. Máy chủ trung tâm này phải có tính sẵn sàng cao và tính bảo mật cao, nhưng có thể có thông lượng thấp. Chìa khóa có thể được lưu trữ trong một mô-đun bảo mật phần cứng.
  2. Bước đầu tiên kết hợp khóa với số phiên bản giao thức theo cách rõ ràng ("AWS4" + phím). Điều này cho phép nâng cấp giao thức sử dụng cùng một khóa, do đó bạn không phải phân phối các khóa mới cùng lúc với việc nâng cấp giao thức.
  3. Bước thứ hai kết hợp khóa với ngày (HMAC(dateStamp, "AWS4" + phím); các giao thức chỉ định một dấu ngày với độ phân giải 1 ngày). Chìa khóa thay đổi mỗi ngày. Những thay đổi nhanh hơn yêu cầu nhiều thông lượng hơn trên máy chủ trung tâm, trong khi những thay đổi chậm hơn có nghĩa là tác động lớn hơn trong trường hợp thứ gì đó bên dưới chuỗi bị xâm phạm.
  4. Mỗi ngày, mỗi máy chủ khu vực yêu cầu khóa khu vực của ngày kRegion = HMAC(tên vùng, HMAC(dateStamp, "AWS4" + key)). Máy chủ trung tâm có thể xác thực máy chủ khu vực để đảm bảo rằng chỉ máy chủ của khu vực nhất định mới có thể lấy được khóa khu vực.
  5. Mỗi dịch vụ sử dụng khóa đều yêu cầu khóa riêng kService = HMAC(kRegion, tên dịch vụ) từ khu vực mà nó đang chạy. Máy chủ khu vực có thể xác thực dịch vụ để đảm bảo rằng dịch vụ không học khóa của dịch vụ khác.
  6. Dịch vụ kết hợp khóa của nó với một mục đích: kSigning = HMAC(kService, "aws4_request"). Điều này cho phép sử dụng cùng một khóa chính cho các mục đích khác nhau nếu cần.

Ưu điểm của việc so le này là mỗi người tham gia chỉ có quyền truy cập vào các khóa riêng của mình. Không thể tìm thấy khóa chính được cung cấp kVùng, hoặc để tìm khóa vùng đã cho kDịch vụhoặc để tìm khóa dịch vụ được cung cấp kKý tên. Điều này giảm thiểu tác động của một thỏa hiệp: chỉ những người tham gia trong chuỗi mới bị ảnh hưởng. Ví dụ: nếu vi phạm được phát hiện trong trung tâm dữ liệu của Mỹ vào ngày 2022-01-05 và nhật ký cho thấy vi phạm xảy ra vào ngày 2022-01-01 thì chỉ những chữ ký được thực hiện sau ngày 2022-01-01 ở khu vực Hoa Kỳ là đáng ngờ và có thể cần phải được thu hồi. Chữ ký được thực hiện ở Châu Âu hoặc trước ngày 2022-01-01 vẫn còn tốt.

Tất nhiên, chỉ những triển khai lớn mới sử dụng tính linh hoạt này. Trong phần lớn các ứng dụng, toàn bộ phép tính được thực hiện trong cùng một phần mềm trong một chức năng duy nhất. Tuy nhiên, giao thức mở rộng quy mô triển khai lớn sử dụng phân vùng để giảm thiểu tác động của vi phạm.

Kết hợp tất cả các yếu tố đầu vào cùng một lúc:

lá cờ us
@autotester Thật vậy, điều này đã được giải thích trong một trong những bài phát biểu quan trọng năm nay về: Phát minh. Mục đích chính là ủy quyền xác thực cho các vùng/dịch vụ riêng lẻ. Mỗi dịch vụ sẽ nhận được một khóa dẫn xuất cho người dùng sau khi hợp lệ trong ngày, do đó, bản thân dịch vụ đó không có quyền truy cập vào khóa bí mật, nhưng dịch vụ sẽ không cần liên hệ với IAM trung tâm cho mỗi yêu cầu xác thực.
Điểm:1
lá cờ us

Vì vậy, vấn đề AWS đang giải quyết ở đây là họ có một bộ giá trị, cụ thể là dịch vụ, khu vực và ngày hiện tại và họ muốn lấy một khóa bí mật khác phụ thuộc vào tất cả các giá trị này.

Bạn có thể tiếp tục và làm điều này với một PRF thông thường nhưng sau đó bạn gặp phải một vấn đề: Cụ thể là bạn không muốn gặp phải tình huống mà các giá trị xấu của bất kỳ mục nhập bộ dữ liệu nào đột nhiên dẫn đến xung đột khóa. Một sai lầm cổ điển sẽ e.g. được sử dụng nối thẳng và nếu họ không cẩn thận, bạn sẽ kết thúc với (hôm nay)(hôm nay) mang lại cùng một khóa. Rõ ràng là các chuỗi đang chơi ở đây có nhiều cấu trúc hơn so với ví dụ, nhưng mối lo lắng cơ bản phải rõ ràng.

Bây giờ, cách hiệu quả nhất để giải quyết vấn đề trên là sử dụng chức năng ghép nối đảm bảo rằng không có hai bộ dữ liệu đầu vào riêng biệt nào mang lại cùng một đầu ra và do đó, cùng một đầu vào cho PRF. Tuy nhiên, việc thiết kế các chức năng như vậy cũng dễ bị lỗi nhẹ.

Tôi đoán chính vì điều này mà AWS đã chọn sử dụng chuỗi yêu cầu HMAC phức tạp này. Giờ đây, họ không phải lo lắng về các chức năng ghép nối phức tạp và tất cả những gì cần thiết là một loạt các đánh giá HMAC có thể thực hiện được ở hầu hết mọi ngôn ngữ/môi trường. Thực tế là điều này sau đó yêu cầu không ít hơn các hoạt động của HMAC được bù đắp bởi thực tế là tất cả các đầu vào cho dẫn xuất khóa này là phần nào tĩnh và bạn có thể lưu trữ các khóa trong khoảng một ngày nếu các hoạt động của HMAC tiêu tốn đáng kể thời gian tính toán của bạn.

automatictester avatar
lá cờ ht
Việc tính toán HMAC một lần trên chuỗi có cấu trúc như `[dateStamp=...;regionName=...;serviceName=...]` có phải là một giải pháp dễ dàng hơn cho vấn đề này không?
lá cờ us
@autotester đó chỉ là một giải pháp khác, một quyết định thiết kế. Khi đầu vào "có cấu trúc" có thể chứa bất kỳ đầu vào máy khách nào (khóa s3, id hàng db,.) thì tôi thà sử dụng hàm băm lồng nhau hơn là mạo hiểm với bất kỳ xung đột tiềm ẩn nào.
Gilles 'SO- stop being evil' avatar
lá cờ cn
@autotester Tại sao bạn nghĩ nó sẽ dễ dàng hơn? So sánh số dòng mã cho hai giải pháp và lưu ý xem nếu chuỗi có cấu trúc dễ xây dựng, điều đó có nghĩa là bạn đang thêm một thư viện định dạng dữ liệu lớn làm phần phụ thuộc.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.