2016-11-23 3 views
1

私はいくつかのデータを暗号化して、AzureにデプロイされているWebサイトのユーザーCookieに格納しようとしています。Azureのウェブサイトでのデータ保護/暗号化?

私はSystem.SecurityのDataProtection APIを見てみましたが、マシンやユーザーのスコープが必要なようですが、Azureにデプロイすると機能しません。

は、その後、私はAesCryptoServiceProviderを使用して、私のWeb.configファイルにキーを保存しようとしたが、私はこのエラーを取得:

CryptographicException: The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context, which may be the case when the thread is impersonating.

私はエラーにまで読んでいたと明らかにあなたはIISの設定を微調整する必要があり、 Azureでは動作しません。

私はDataProtection Asp.NET Coreパッケージを見てみましたが、新しいパッケージやドキュメントの多くがローカルフォルダに暗号情報を保存する必要があると言われました。それは専用マシンなしでAzureで動作するようには思われません。

Azureウェブサイトのデータを保護/保護解除する正しい方法は何ですか?

+0

あなたは** ** web.configの接続文字列を保護する意味ですか? –

+0

@LeiYangいいえ、私はweb.configで何も話していません。私はVSAからOAuthアクセストークンを保護し、それをクッキーとして保存したいと考えています。 – RandomEngy

+0

なぜWeb.configが**危険な**、IIS、そしてAzureであると思われますか? –

答えて

0

エラーを投げていたのはDataProtection APIだけでした。 AesManagedAesCryptoServiceProviderはどちらもまだAzureで動作しています。ここでは、私が使用し終わったものです:

private const string AesKey = "206283c07cbfda1c0c126ef56d78ba9a0aeb53a06cd65f10bd3a9cb9a68e3fe1"; 

public static byte[] Encrypt(byte[] toEncrypt) 
{ 
    byte[] encrypted; 

    var aes = new AesCryptoServiceProvider(); 
    aes.Key = StringToByteArray(AesKey); 

    // Create a new IV for each item to encrypt 
    aes.GenerateIV(); 
    byte[] iv = aes.IV; 

    using (var encrypter = aes.CreateEncryptor(aes.Key, iv)) 
    using (var cipherStream = new MemoryStream()) 
    { 
     using (var cryptoStream = new CryptoStream(cipherStream, encrypter, CryptoStreamMode.Write)) 
     using (var binaryWriter = new BinaryWriter(cryptoStream)) 
     { 
      // Prepend unencrypted IV to data 
      cipherStream.Write(iv, 0, iv.Length); 
      binaryWriter.Write(toEncrypt); 
      cryptoStream.FlushFinalBlock(); 
     } 

     encrypted = cipherStream.ToArray(); 
    } 

    return encrypted; 
} 

public static byte[] EncryptFromString(string toEncrypt) 
{ 
    return Encrypt(Encoding.UTF8.GetBytes(toEncrypt)); 
} 

public static byte[] Decrypt(byte[] toDecrypt) 
{ 
    var aes = new AesCryptoServiceProvider(); 
    aes.Key = StringToByteArray(AesKey); 

    // Pull out the unencrypted IV first 
    byte[] iv = new byte[16]; 
    Array.Copy(toDecrypt, 0, iv, 0, iv.Length); 

    using (var encryptedMemoryStream = new MemoryStream()) 
    { 
     using (var cryptoStream = new CryptoStream(encryptedMemoryStream, aes.CreateDecryptor(aes.Key, iv), CryptoStreamMode.Write)) 
     using (var binaryWriter = new BinaryWriter(cryptoStream)) 
     { 
      // Decrypt Cipher Text from Message 
      binaryWriter.Write(
       toDecrypt, 
       iv.Length, 
       toDecrypt.Length - iv.Length 
      ); 
     } 

     return encryptedMemoryStream.ToArray(); 
    } 
} 

public static string DecryptToString(byte[] toDecrypt) 
{ 
    return Encoding.UTF8.GetString(Decrypt(toDecrypt)); 
} 

public static string ByteArrayToString(byte[] array) 
{ 
    StringBuilder hex = new StringBuilder(array.Length * 2); 
    foreach (byte b in array) 
    { 
     hex.AppendFormat("{0:x2}", b); 
    } 

    return hex.ToString(); 
} 

public static byte[] StringToByteArray(string hex) 
{ 
    int charCount = hex.Length; 
    byte[] bytes = new byte[charCount/2]; 
    for (int i = 0; i < charCount; i += 2) 
    { 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    } 

    return bytes; 
} 
+1

ここでは、暗号文を検証する方法がありません。 GCMモードを使用するか、HMACを追加するにはスワップする必要があります。 –

+0

@ LukePark私の場合、ユーザーがデータを改ざんしようとしても気にしません。それはトークンを壊すだけです。あなたがGCMやHMACを追加して答えるのが気になるのであれば、私はあなたの方法でアップヴォートを投げます。 :) – RandomEngy

+0

Nah。それは本当に公正なポイントです。ちょうどあなたがトークンを使ってある時点で自分自身を検証すると思っていただけです。 –

関連する問題