2012-01-16 36 views
8

Tôi đang phát xung quanh với ứng dụng để sao lưu tệp vào "đám mây" :) và tôi muốn mã hóa các tệp trước khi lưu trữ chúng. Đó là một phần tôi đã bảo hiểm, nhưng như ứng dụng này sẽ được theo dõi các thư mục để thay đổi và tải lên các tập tin thay đổi tôi cần phải lưu trữ chìa khóa mà tôi sử dụng để mã hóa các tập tin với. Ý tưởng là người dùng cung cấp mật khẩu và một khóa được tạo ra.Cách lưu trữ khóa được sử dụng để mã hóa các tệp

Hiện tại tôi đang sử dụng .NET Framework để thực hiện mã hóa. Tôi đang sử dụng lớp RijndaelManaged để mã hóa/giải mã và lớp PasswordDeriveBytes để lấy khóa.

Nhưng làm cách nào để giữ khóa được sử dụng để mã hóa các tệp? Tôi cũng muốn chương trình bắt đầu với Windows và không cần phải yêu cầu người dùng nhập lại mật khẩu của họ.

+0

Điều này có thể giúp http://stackoverflow.com/questions/723653/storing-encryption-keys-best-practices –

Trả lời

12

Tôi khuyên bạn nên tránh sử dụng mã hóa không đối xứng để mã hóa các tệp của mình. Mã hóa bất đối xứng đắt hơn đáng kể (tính toán) so với các thuật toán mã hóa đối xứng có cường độ bằng nhau. Để mã hóa các tệp lớn, tôi khuyên bạn nên sử dụng AES qua RSA bất kỳ ngày nào.

Đối với câu hỏi của bạn - API bảo vệ dữ liệu (DPAPI) Gaurav đề cập là đặt cược tốt nhất của bạn trên Windows. How to: Use Data Protection

DPAPI cung cấp ProtectedMemoryProtectedData. Trước đây cho phép bạn bảo vệ bí mật trong bộ nhớ, sau này cho phép bảo vệ bí mật tồn tại trên đĩa. API quản lý mã hóa & giải mã cho bạn và (tùy thuộc vào phạm vi được chỉ định) sẽ bảo vệ dữ liệu của bạn khỏi truy cập/giải mã bởi người dùng khác hoặc trên các máy khác.

Để sử dụng DPAPI trong trường hợp của bạn, tôi khuyên bạn nên lấy mật khẩu người dùng, tạo khóa mã hóa đối xứng (ví dụ: PasswordDeriveBytes), lưu trữ bằng DPAPI và hạn chế quyền truy cập cho người dùng hiện tại.

Ứng dụng của bạn có thể sử dụng khóa đó để mã hóa tất cả video tải lên. Ứng dụng của bạn có thể lấy khóa mà không cần nhắc lại người dùng và khóa có thể được người dùng tạo lại trên hệ thống mới.

Một nhược điểm là ứng dụng độc hại cũng được thực hiện bởi cùng một người dùng có khả năng có thể lấy khóa bí mật. Để bảo vệ chống lại tình huống này, entropy bổ sung (hiệu quả là muối) phải được cung cấp trong Protect & Unprotect. Tuy nhiên việc thực hiện điều này có thể sẽ đi lạc khỏi mục tiêu của bạn - bởi vì bây giờ bạn sẽ cần nhắc người dùng về một thứ có vẻ khủng khiếp như mật khẩu.

Ngoài ra: thú vị đọc:

Bạn cũng có thể tìm thấy bài viết này từ Backblaze một chi thú vị. Mặc dù họ không giải thích làm thế nào họ hỗ trợ kịch bản của bạn (cập nhật mã hóa mà các nhà cung cấp điện toán đám mây không thể giải mã - duy nhất mà họ cung cấp như một dịch vụ): http://blog.backblaze.com/2008/11/12/how-to-make-strong-encryption-easy-to-use/

Disclaimer: Tôi là khách hàng Backblaze hài lòng, nhưng tôi không có cách nào khác liên kết với dịch vụ của họ.

PS: Hãy dành thời gian để đánh dấu các câu trả lời có thể chấp nhận được. Cộng đồng sẽ thưởng cho bạn.

+0

Cảm ơn bạn Tails, câu trả lời rất phức tạp. Sau một vài thử nghiệm, điều này dường như làm chính xác những gì tôi cần :) –

+1

Và một mẹo hay cho câu trả lời này là dữ liệu được bảo vệ (ở đây khóa) sẽ không hữu ích nếu người dùng ứng dụng thay đổi cửa sổ của mình, vì vậy nếu dữ liệu rất quan trọng và các cửa sổ có thể được thay đổi, tốt hơn là giữ (các) khóa bằng cách sử dụng các phương thức mã hóa thông thường để có thể giải mã nó cho các tình huống như vậy (ví dụ: bạn có thể cung cấp mật khẩu không đổi cho các thuật toán mã hóa/giải mã khóa). –

4

Tôi đề nghị bạn sử dụng mã hóa bất đối xứng như tôi đã mô tả here. Điều đó sẽ cho phép bạn chỉ có một khóa riêng duy nhất để bảo vệ (và sao lưu) ngay cả khi mọi tệp sẽ được mã hóa bằng khóa đối xứng khác nhau.

Bạn cũng có thể cho phép Windows (thực tế là CryptoAPI) bảo vệ khóa bằng cách sử dụng CspParameters (và cờ phải) bằng RSACryptoServiceProvider. Tùy thuộc vào cờ của bạn, bạn có thể có khóa sẽ có sẵn cho số đã đăng nhập trên người dùng (vì vậy nó được làm bảo mật làm mật khẩu đăng nhập của người dùng).

0

Tôi đồng ý với đề xuất DPAPI. Dưới đây là một số mã để minh họa cách sử dụng lớp ProtectedData. Đây không phải là chính xác cho các kịch bản chính xác của bạn, nhưng bạn có thể ngoại suy.

byte[] GetEncryptionKey() 
{ 
    var path = Path.Combine(
     Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
     AppDomain.CurrentDomain.FriendlyName, 
     "nothing interesting... move along", 
     "top secret encryption key"); 

    Debug.WriteLine("Encryption Key File: " + path); 

    var file = new FileInfo(path); 
    if (!file.Directory.Exists) 
     file.Directory.Create(); 

    // determine if current user of machine 
    // or any user of machine can decrypt the key 
    var scope = DataProtectionScope.CurrentUser; 

    // make it a bit tougher to decrypt 
    var entropy = Encoding.UTF8.GetBytes("correct horse battery staple :)"); 

    if (file.Exists) 
    { 
     return ProtectedData.Unprotect(
      File.ReadAllBytes(path), entropy, scope);  
    } 

    // generate key 
    byte[] key; 
    using(var rng = RNGCryptoServiceProvider.Create()) 
     key = rng.GetBytes(1024); 

    // encrypt the key 
    var encrypted = ProtectedData.Protect(key, entropy, scope); 

    // save for later use 
    File.WriteAllBytes(path, encrypted); 

    return key; 
} 
Các vấn đề liên quan