MS certificering: 70-483, deel 6

Ingediend door Dirk Hornstra op 22-mar-2018 18:46

Door met module 5, advanced C#, Type and Value Validation - Encryption. Dit is de derde video deze week. Ik had op zich nog wel wat andere zaken willen doen (Angular, Umbraco), maar als je 1 video per week doet, dat schiet niet echt op. Kijken of we tempo kunnen maken. Dit is dus wederom de C# Jump Start Video.

Data validatie is het testen van waardes die aangeboden worden (via service, bestand of data-invoer) vergelijken met verwachte waardes en ranges. Wat moet je daarbij voorkomen? Overflow, onjuiste resultaten, ongewenste bij-effecten, zorg voor begeleiding van gebruikers en systemen en voorkom beveiligingsproblemen. 

De compiler valideert of het object type juist is. Het valideert niet de waarde van het object.
Debug / Trace Assert() methoden alarmeren de ontwikkelaar of de gebruiker
Een exceptie raisen doe je met system.ArgumentException, System.ArgumentOutOfRangeException, System.ArgumentNullException


public override voide SetName(string value)
{
  // validate empty
  if (string.IsNullOrWhiteSpace(value))
    throw new ArgumentNullException("value");

  // validate conflict
  if (value == this.Name)
    throw new ArgumentException("value is duplicate");

  // validate size
  if (value.Length > 10)
    throw new ArgumentException("value is too long");

  this.Name = value;
}

Animal cat = new Cat();
Animal dog = new Dog();
if (cat is Dog) throw new NotSupportedException("Dogs only!");
if (cat == dog) throw new Exception("not the same");
if (cat.Equals(dog)) throw new Exception("not equal");

Datacontracten. Design by Contract, van de Eiffel programmeertaal. 
Codecontracten zijn een uniform systeem dat alle andere implementaties van data validaties vervangt
Codecontracten hebben precondities (requires) en post-conditions (ensures).
Een contract assertion kan statisch geevalueerd worden.
Een contract assertion kan afgedwongen worden tijdens runtime.

We gaan naar demo 23 om te kijken hoe het werkt. We zien in de class Dog dat het Contract.Ensures(..) wordt afgedwongen wat waardes moeten zijn.

 


public void SetName(string value)
{
// validate input
Contract.Requires(!string.IsNullOrWhiteSpace(value), "value is empty");
this.Name = value;
}

public string GetName()
{
  Contract.Ensures(!string.IsNullOrWhiteSpace(Contract.Result<string>()));
  return this.Name;
}

normale flow:
if (value.Length > 10) throw new ArgumentException("value is too long");
Contract.EndContractBlock(); // alles hierboven worden Contract-excepties
 

Je moet hiervoor wel de add-in installeren. Voor security-controles zou je dit niet moeten gebruiken.

We gaan naar de Unhandled Exceptions.
Dit gebeurt buiten het try-statement. Runtime vangt dit af, beschermt het systeem, maar niet jouw applicatie.
try / catch, try / catch / finally, try / finally

We gaan door met encryptie. Maakt data onleesbaar voor een persoon of systeem tot het decryptie-algoritme toegepast is. 
Encryptie verbergt data niet, het maakt het onleesbaar.
Encryptie is niet hetzelfde als compressie!

Encryptietypes:
- File Encryption
- Windows Data Protection
- Hashing, gebruikt voor signing en validating
- Symmetrisch en Asymetrisch

We zien hoe Jerry in Windows via de eigenschappen een bestand kan encrypten. Vervolgens zien we een stukje code, met het simpele statement File.Encrypt("bestandsnaam.txt") is het afgerond. Het is een snelle manier om te encrypten en decrypten. Gebaseerd op user credentials.

Hierna hebben we nog de Windows Data Protection. Bijna gelijk aan File encryption, alleen doet die dat op basis van bestanden, WDP doet dit op een array van bytes. Het maakt intern een key om te encrypten en decrypten op basis van wie je bent. 

ProtectedData.Protect(datatoProtectArray, null, DataProtectionScope.CurrentUser);
ProtectedData.UnProtect(encryptedData, null, DataProtectionScope.CurrentUser (.LocalMachine) );

We gaan door met "signing", aangeven dat data niet door iemand bewerkt is. We gaan dus door met Hashing.
One-way encryption. Algemene algoritmes: MD5 (16 karakter hash die in een GUID opgeslagen kan worden).
SHA (SHA1, SHA256, SHA384, SHA512)
Het is snel (afhankelijk van het gekozen algoritme)
Gebruikt om wachtwoorden op te slaan, bestanden vergelijken, data-corruptie/controle op ongewenste aanpassingen
Gebruik SHA256 of groter voor wachtwoorden of andere data die niet openbaar mag worden.
SHA256.Create().ComputeHash(passwordByteArray);

Controle vervolgens een if (passwordHash.SequenceEqual(storedPasswordHash)).
Die kende ik nog niet, zo kun je op een simpele manier 2 lijsten van bytes met elkaar vergelijken.

We gaan door met symmetrische encryptie. Je gebruikt 1 sleutel om encryptie en decryptie uit te voeren.
Het is sneller dan asymmetrische encryptie. De Cryptography-namespace heeft er 5: AES (aanbevolen), DES, RC2, Rijndael, TripleDES.

Asymmetrisch (public key encryptie). Je gebruikt 1 sleutel om te encrypten en 1 sleutel om te decrypten. Je gebruikt het meestal voor digitale handtekeningen. De Cryptography namespace heeft er 4:  DSA, ECDiffieHellman, ECDsa, RSA (meest populair).

We krijgen vervolgens een voorbeeld te zien:


var key = new byte[] {12, 2,56,...}; // 16 bytes

// initalizationvector, ook 16 bytes. kan publiek gedeeld worden. elke berichtuitwisseling aanpassen
var initializationVector = new byte[] {37, 99, 102, ..}; // dit is een soort seed bij een random
byte[] symEncryptedData;
var algorithm = Aes.Create();

// encrypt
using (var encryptor = algorithm.CreateEncryptor(key, initializationVector))
using (var memoryStream = new MemoryStream())
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(dataToProtect, 0, dataToProtect.Length);
cryptoStream.FlushFinalBlock();
symEncryptedData = memoryStream.ToArray();
}

// decrypt
byte[] symUnencryptedData;
bijna identiek, .CreateDecryptor(..) in plaats van een CreateEncryptor.