2012-01-16 13 views
8

「クラウド」にファイルをバックアップするアプリを使って遊んでいます。ファイルを保存する前に暗号化したいと思っています。その部分はカバーしましたが、このアプリケーションは変更のためのフォルダを監視し、変更されたファイルをアップロードするので、ファイルを暗号化するために使用する鍵を保存する必要があります。アイデアは、ユーザーがパスワードを提供し、キーが生成されるということです。ファイルの暗号化に使用する鍵を保存する方法

現時点では、.NET Frameworkを使用して暗号化を行っています。私はRijndaelManagedクラスを使用して暗号化/復号化し、PasswordDeriveBytesクラスを使用してキーを取得しています。

しかし、ファイルの暗号化に使用される鍵はどのように保持する必要がありますか?また、Windowsでプログラムを開始し、ユーザーに再度パスワードを入力させる必要はありません。

+0

これはhttp://stackoverflow.com/questions/723653/storing-encryption-keys-best-practices –

答えて

12

ファイルの暗号化に非対称暗号化を使用しないことをおすすめします。非対称暗号化は、同等の強度の対称暗号化アルゴリズムよりもかなり高価(計算上)です。大きなファイルを暗号化するには、いつでもRSA経由でAESをお勧めします。

あなたの質問について - Data Protection API(DPAPI)Gauravに言及すると、Windowsでの最良の選択です。 How to: Use Data Protection

DPAPIはProtectedMemoryProtectedDataです。前者はメモリ内の秘密を保護することを可能にし、後者はディスクに保存された秘密を保護します。 APIはあなたのために暗号化&を処理し、(指定された範囲に応じて)他のユーザーや他のマシンのデータへのアクセスを保護します。

シナリオでDPAPIを使用するには、ユーザーのパスワードを取り、対称暗号化キー(例:PasswordDeriveBytes)を生成し、DPAPIを使用して保存し、現在のユーザーへのアクセスを制限することをおすすめします。

アプリケーションは、そのキーを使用してすべてのアップロードを暗号化できます。アプリケーションは、ユーザーに再度プロンプトを表示せずにキーを取得することができ、キーは新しいシステムでユーザーによって再生成されます。

悪意のあるアプリケーションも同じユーザーによって実行されると、潜在的に秘密鍵が取得される可能性があります。このシナリオから保護するために、追加のエントロピー(効果的に塩)をProtect & Unprotectで提供する必要があります。しかし、これを実装することは、あなたの目的からはずれる可能性があります。なぜなら、パスワードのように思われるものをユーザーに促す必要があるからです。

また:興味深い読書:

また、Backblazeのから面白いの読み取りをこのポストを見つけることができます。私は満足しBackblazeの顧客だが、それ以外の方法で午前: http://blog.backblaze.com/2008/11/12/how-to-make-strong-encryption-easy-to-use/

免責事項: - (彼らはそのようなサービスを提供することだけをクラウドプロバイダーが解読することはできません暗号化されたアップロード)彼らはあなたのシナリオをサポート方法については説明しませんが、彼らのサービスと提携しています。

PS:受け入れ可能な回答をマークする時間がかかります。コミュニティがあなたに報酬を与えます。

+0

を助けるかもしれない、あなたは非常に精巧な答えを尾をありがとうございます。いくつかのテストの後、これは私が必要とするものを正確に行うようです:) –

+1

この回答の良いヒントは、アプリケーションのユーザが自分のウィンドウを変更した場合、保護されたデータ(ここではキー)は役に立ちません。非常に重要でウィンドウが変更される可能性があるので、通常の暗号化方法を使用して鍵を保持しておくことが望ましいです(例えば、鍵enc/decアルゴリズムに一定のパスワードを与えるなど)。 –

4

hereのように非対称暗号化を使用することをお勧めします。これにより、すべてのファイルが異なるの対称キーで暗号化されている間でも、保護する単一の秘密鍵(およびバックアップ)だけを持つことができます。

また、Windows(実際のCryptoAPI)RSACryptoServiceProviderCspParameters(および右旗)を使用して、鍵を保護させることができます。あなたのフラグに応じて、がユーザのに記録されているため、というユーザのログインパスワードとして安全なが得られます。

0

私はDPAPIの提案に同意します。 ProtectedDataクラスの使い方を示すコードをいくつか紹介します。あなたの正確なシナリオでは、これは正確に密接なものではありませんが、あなたは推測することができます。

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; 
} 
関連する問題