Il arrive que l'’on doive échanger des données sensibles, par exemple à travers du réseau, ou entre des couches applicatives. Pour cela on a accès à toute une couche de sécurité qui est très simple à utiliser et qui inclue les algos les plus classiques, qu’il s’agisse de crypto (AES, RSA etc) ou du hashage (HMAC, SHA1, SHA256…). Cette couche permet de crypter un contenu à partir d’une clef secrète ou d’un couple clef publique / clef privée.

Mais parfois on veut stocker ces données, et autant on peut utiliser ces algos pour stocker les crypter, on ne peut pas les utiliser pour stocker la clef de cryptage elle-même! Dans ce cas, on a la Data Protection API (DPAPI) qui utilise une clef secrète contenue dans le téléphone, impossible à récupérer et qui permettra de crypter n’importe quel type de contenu. Cette DPAPI est accessible depuis la classe statique System.Security.Cryptography.ProtectedData. Celle ci contient 2 méthodes, Protect et UnProtect, qui agissent tout simplement sur des tableaux de bytes:

Un exemple de cryptage:

byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(data);
byte[] encryptedData = ProtectedData.Protect(dataBytes, null);

Et un décryptage, aussi simple!

byte[] decryptedData = ProtectedData.Unprotect(encryptedData, null);
result = new string(System.Text.Encoding.UTF8.GetChars(decryptedData));

 

En tout état de cause, si vous n’avez qu’à stocker des données cryptées et pas forcément à les partager, vous pouvez ne vous servir que de cette classe. Ca simplifie grandement l’écriture de certaines applications comme par exemple les coffres de mots de passe… mais n’oubliez pas de gérer, lors de vos cryptages/décryptages, les tombstoning correctement…  et n’écrivez jamais nulle-part un secret en clair!