2013-06-19 74 views
5

Có ai biết cách lấy giá trị khóa 256 bit được tạo từ cụm từ mật khẩu có độ dài bất kỳ không? Mã hóa không thể được muối vì các giá trị được mã hóa cần được tạo lại và so sánh trong cơ sở dữ liệu. Vì vậy, một giá trị phải tạo ra cùng một chuỗi được mã hóa mỗi khi nó được mã hóa.tạo giá trị khóa AES 256 bit

Hiện tại tôi đang sử dụng khóa 32 char hoạt động trên giả định có thể không chính xác, đây là 256 bit?

Vì vậy, tôi muốn 'con cáo màu nâu nhanh' được chuyển đổi thành khóa AES 256 bit phù hợp?

+2

"Mã hóa không thể được muối vì các giá trị được mã hóa cần phải được tạo lại" Đó là lý do tại sao lưu trữ muối cùng với mật khẩu băm là phổ biến. Bằng cách này, nếu hai người dùng khác nhau có cùng một mật khẩu, nó tạo ra các băm khác nhau, nhưng đối với một người dùng duy nhất, cùng một mật khẩu sẽ luôn tạo ra cùng một băm. – svick

+0

thẳng thắn, không có muối, nó không thực sự được mã hóa. Không thể thực hiện tra cứu cơ sở dữ liệu trực tiếp với giá trị được mã hóa. – Matthew

Trả lời

12

Bạn có thể xây dựng các Rfc2898DeriveBytes Class với một mật khẩu có kích thước tùy ý và sau đó lấy một phím kích thước mong muốn của bạn trong trường hợp này, 256 bit (32 byte):

private static byte[] CreateKey(string password, int keyBytes = 32) 
{ 
    const int Iterations = 300; 
    var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations); 
    return keyGenerator.GetBytes(keyBytes); 
} 

Để sản xuất ra một sản lượng xác định (ví dụ: cùng một đầu vào sẽ tạo ra cùng một đầu ra), bạn sẽ cần phải mã hóa cứng muối. Muối phải có ít nhất 8 byte:

private static readonly byte[] Salt = 
    new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80}; 
+0

Xem phần giải thích của tôi để có mô tả lý thuyết hơn ở trên. Lưu ý rằng 'Rfc2898DeriveBytes' triển khai PBKDF2 :) –

+0

Cảm ơn bạn - điều này rất hữu ích. Nên keySize là 32 mặc dù để có được một mảng khóa 32 byte? – bhs

+0

Vâng, tôi đoán đó là một chút sai lầm của ByteBlast. Tôi cũng khuyên bạn nên mã hóa mật khẩu thành byte bằng cách sử dụng mã hóa UTF-8, vì hàm Rfc2898DeriveBytes không chỉ định rõ mã hóa mà nó sử dụng. Đó là khó khăn khi bạn sử dụng hàm từ một thời gian chạy khác. –

-1

Bạn có thể sử dụng một số chức năng băm cung cấp 256 bit outuput từ đầu vào của bất kỳ chiều dài, ví dụ SHA256.

+1

Chính thức một hàm băm không phải là một hàm dựa trên mật khẩu dựa trên khóa và không được sử dụng trực tiếp như vậy. –

2

Có lẽ cách tốt nhất là sử dụng PBKDF2 sử dụng SHA256 (mà sẽ tạo ra 256 bit) và một ứng dụng cụ thể muối & lặp đếm. Bạn nên lưu ý rằng việc sử dụng một loại muối cụ thể của ứng dụng đã loại bỏ khá nhiều sự bảo vệ khỏi PBKDF2, vì vậy bạn có thể yêu cầu bảo vệ bổ sung để giảm bớt vấn đề này. Một phương pháp sẽ là đảm bảo rằng cơ sở dữ liệu an toàn và có thể sử dụng một số lượng thử tối đa.

Bạn đúng trong việc quy định rằng cụm mật khẩu 32 ký tự không phải là khóa 256 bit. Nó không chứa đủ entropy, và một số byte thậm chí có thể không có các biểu diễn ký tự hợp lệ.

+0

Xem ByteBlasts trả lời cho việc thực hiện ở trên :) –

+0

Cảm ơn - vì vậy mảng 32 byte từ phương pháp trên là khóa 256 bit? – bhs

+0

Đó là chức năng dẫn xuất khóa dựa trên mật khẩu, đó là ý nghĩa của PBKDF. Bạn đặt mật khẩu vào, bạn lấy lại khóa (dưới dạng byte). Nó có bảo vệ bằng cách sử dụng một muối và một số lần lặp lại, điều này khiến cho việc tính toán khóa (cả cho bạn và kẻ tấn công) tương đối khó khăn. Một kẻ tấn công có thể cần phải làm rất nhiều trong số họ để có được chìa khóa mặc dù. Tuy nhiên, tốt nhất nên sử dụng SHA-256 hoặc cao hơn vì nó đòi hỏi phải thực hiện đầy đủ các lần lặp cho bất kỳ thứ gì ở trên một đầu ra băm - và điều này có khả năng chỉ gây lỗi cho bạn chứ không phải là kẻ tấn công. –