2016-11-23 5 views
1

Ich versuche, einige Daten zu verschlüsseln, die in einem Benutzer-Cookie von einer auf Azure bereitgestellten Website gespeichert werden.Datenschutz/Verschlüsselung auf Azure-Websites?

habe ich versucht, an den Datenschutz Seite APIs in System.Security suchen, aber sie scheinen alle eine Maschine oder Benutzerbereich zu müssen, die, wenn sie auf Azure eingesetzt funktioniert nicht.

Dann habe ich versucht, die AesCryptoServiceProvider verwenden und den Schlüssel in meinem Web.config speichern, aber ich habe diesen Fehler:

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.

Ich war auf dem Fehler beim Lesen und offenbar müssen Sie eine IIS-Einstellung optimieren, das funktioniert nicht für Azure.

Ich habe auch versucht, das DataProtection Asp.NET Core-Paket zu betrachten, aber es brachte eine ganze Menge neuer Pakete und die erwähnten Dokumente, die Kryptoinformationen in einem lokalen Ordner speichern müssen; was wiederum nicht so aussieht, als würde es auf Azure ohne eine dedizierte Maschine funktionieren.

Was ist der richtige Weg/unprotect Daten auf einer Azure Webseite zu schützen?

+0

Meinst du ** nur **, Verbindungszeichenfolge in web.config zu schützen? –

+0

@LeiYang Nein, ich rede nicht über irgendetwas in web.config. Ich möchte ein OAuth-Zugriffstoken vor VSTS schützen und es als Cookie speichern. – RandomEngy

+0

Warum ist web.config ** gefährlich, in IIS und sogar in Azure? –

Antwort

0

Stellt sich heraus, es war nur die API Datenschutz Seite, die den Fehler warf. AesManaged und AesCryptoServiceProvider funktionieren immer noch in Azure. Hier ist, was ich am Ende verwendet:

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

Sie haben hier keine Möglichkeit, den Chiffretext zu validieren. Sie sollten den GCM-Modus wechseln oder einen HMAC hinzufügen. –

+0

@LukePark In meinem Fall ist es mir egal, wenn Benutzer versuchen, die Daten zu manipulieren. Alles, was es tun würde, ist ihr Token zu verfälschen. Obwohl, wenn Sie mit dem GCM oder HMAC hinzugefügt werden möchten, werde ich eine Upvote auf Ihre Art und Weise werfen. :) – RandomEngy

+0

Nein. Das ist wirklich ein fairer Punkt. Ich dachte nur, Sie könnten den Token verwenden, um den Benutzer selbst zu validieren. –

Verwandte Themen