2013-07-10 32 views
6

Tôi đang tìm cách triển khai yêu cầu đăng ký HMACSHA256 trong API tôi đang xây dựng. Từ những gì tôi hiểu được từ https://tools.ietf.org/html/rfc4868, tốt nhất là khóa bí mật có cùng số bit như thuật toán băm (tức là các khóa bí mật SHA256 phải là 256 bit/32 byte).Tạo khóa HMACSHA256 mạnh trong C#

Tôi có thể sử dụng một trong nhiều trình tạo số ngẫu nhiên khác nhau ở đó cho C# hoặc có cách nào cụ thể là các khóa này cần phải được tạo.

Cuối cùng, Amazon Web Services sử dụng HMACSHA256, nhưng khóa bí mật mà họ cung cấp (ít nhất là với tôi) là 320 bit/40 byte (khi khóa được chuyển đổi thành byte bằng UTF-8, xem https://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232). Có một lý do để sử dụng nhiều hơn cần thiết bởi các thuật toán băm kể từ khi nó cắt ngắn?

Trả lời

5

Nếu một chìa khóa dài hơn HMAC hỗ trợ, nó sẽ thường được băm với kích thước thích hợp. Điều này chủ yếu để hỗ trợ các khóa có thể đọc được bằng con người có độ dài tùy ý. Nếu bạn đang tạo một khóa theo chương trình và không cần nó có thể đọc được, tôi khuyên bạn nên sử dụng RandomNumberGenerator. Đây là cơ bản những gì nó đã được thực hiện cho.

using System.Security.Cryptography; 

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 

byte[] data = new byte[32]; 
rng.GetBytes(data); 
10

Một cách để tạo một khóa (có lẽ an toàn) là:

var hmac = new HMACSHA256(); 
var key = Convert.ToBase64String(hmac.Key); 
+1

Base64 không giống với Hex, IE tên biến của bạn gây hiểu nhầm. – Peter

+1

@Peter, cảm ơn vì đã chỉ ra điều đó, tôi đã sửa đổi tên biến. – Omar

Các vấn đề liên quan